I am getting the above error with the below code.
I read somewhere that said I should remove all references to Microsoft.Crm.Sdk.dll
but that didn't work. please assist if you can.
using System;
using System.Collections.Generic;
using Microsoft.Xrm.Sdk;
using InvoiceMVCApp.Models;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Client.Services;
using Microsoft.Xrm.Client;
namespace InvoiceMVCApp.DAL
{
public class DAL_InvoicesEntity
{
public List<InvoicesModel> RetriveRecords()
{
var connection = new CrmConnection("Server=CRM Online");
using (OrganizationService service = new OrganizationService("ConnectionString", connection))
{
QueryExpression query = new QueryExpression
{
EntityName = "invoice",
ColumnSet = new ColumnSet("invoiceid", "customer", "invoicename", "paymentreceived", "commission", "adminfee", "discountamount")
};
List<InvoicesModel> info = new List<InvoicesModel>();
EntityCollection invoiceRecord = service.RetrieveMultiple(query);
if (invoiceRecord != null && invoiceRecord.Entities.Count > 0)
{
InvoicesModel invoiceModel;
for (int i = 0; i < invoiceRecord.Entities.Count; i++)
{
invoiceModel = new InvoicesModel();
if (invoiceRecord[i].Contains("invoiceid") && invoiceRecord[i]["invoiceid"] != null)
invoiceModel.InvoiceID = (Guid)invoiceRecord[i]["invoiceid"];
if (invoiceRecord[i].Contains("customer") && invoiceRecord[i]["customer"] != null)
invoiceModel.ClientName = ((EntityReference)invoiceRecord[i]["customer"]);
if (invoiceRecord[i].Contains("invoiceid") && invoiceRecord[i]["invoiceid"] != null)
invoiceModel.InvoiceNumber = invoiceRecord[i]["invoiceid"].ToString();
if (invoiceRecord[i].Contains("commission") && invoiceRecord[i]["commission"] != null)
invoiceModel.Commission = (decimal)(invoiceRecord[i]["commission"]);
if (invoiceRecord[i].Contains("adminfee") && invoiceRecord[i]["adminfee"] != null)
invoiceModel.AdminFee = (decimal)invoiceRecord[i]["adminfee"];
if (invoiceRecord[i].Contains("discountamount") && invoiceRecord[i]["discountamount"] != null)
invoiceModel.Discount = ((decimal)invoiceRecord[i]["discountamount"]);
info.Add(invoiceModel);
}
}
return info;
}
}
}
}
It looks like there are invalid column names in your column set.
"customer"
should be "customerid"
.
"invoicename"
should be "name"
.
And custom fields like "adminfee"
, "commission"
, and "paymentreceived"
will always have a prefix based on the solution they were created in (default is new_
).
Also, the current preferred method of connecting via the SDK is the CrmServiceClient class in the Microsoft.Xrm.Tooling.Connector namespace.
To find it you can search in NuGet for "Xrm Tooling".
Also, if you're going to cast your results into a custom InvoicesModel class, you might want to look into the Early Bound style of programming where you use a tool to automatically generate proxy classes containing the properties of your D365 entities. This avoids the need to create your own "model" classes for data you retrieve from the system.
Here's a working example to give you some ideas of the possibilities:
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Tooling.Connector;
using System;
using System.Collections.Generic;
using System.Linq;
public class InvoicesModel
{
public Guid? InvoiceID { get; set; }
public EntityReference ClientName { get; set; }
public string InvoiceNumber { get; set; }
public string Name { get; set; }
public bool? PaymentReceived { get; set; }
public decimal? Commission { get; set; }
public decimal? AdminFee { get; set; }
public decimal? DiscountAmount { get; set; }
}
public List<InvoicesModel> RetrieveInvoiceModels(string connectionString)
{
var svc = new CrmServiceClient(connectionString);
var query = new QueryExpression
{
EntityName = "invoice",
ColumnSet = new ColumnSet("invoiceid", "customerid", "invoicenumber", "name", "discountamount"),
TopCount = 10
///Invalid column names: "paymentreceived", "commission", "adminfee",
};
var invoices = svc.RetrieveMultiple(query).Entities.ToList();
var invoiceModels = invoices.Select(i =>
new InvoicesModel
{
InvoiceID = i.GetAttributeValue<Guid>("invoiceid"),
ClientName = i.GetAttributeValue<EntityReference>("customerid"),
InvoiceNumber = i.GetAttributeValue<string>("invoicenumber"),
Name = i.GetAttributeValue<string>("name"),
DiscountAmount = i.GetAttributeValue<Money>("new_discountamount")?.Value
///for when columnn names are fixed:
//PaymentReceived = i.GetAttributeValue<bool>("new_paymentreceived")
//AdminFee = i.GetAttributeValue<Money>("new_adminfee")?.Value,
//Commission = i.GetAttributeValue<Money>("new_commission")?.Value,
})
.ToList();
return invoiceModels;
}