无法从 'Microsoft.Xrm.Sdk.Query.QueryExpression' 转换为 'Microsoft.Crm.Sdk.Query.QueryBase
cannot convert from 'Microsoft.Xrm.Sdk.Query.QueryExpression' to 'Microsoft.Crm.Sdk.Query.QueryBase
我在使用以下代码时遇到上述错误。
我在某处读到说我应该删除所有对 Microsoft.Crm.Sdk.dll
的引用,但这没有用。如果可以请帮忙。
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;
}
}
}
}
尝试清理 -> 重建。没有必要删除引用,您可以使用全名代替 Microsoft.Xrm.Sdk.Query.QueryExpression query = new Microsoft.Xrm.Sdk.Query.QueryExpression(){};
您的列集中似乎有无效的列名。
"customer"
应该是 "customerid"
.
"invoicename"
应该是 "name"
.
"adminfee"
、"commission"
和 "paymentreceived"
等自定义字段将始终具有基于创建它们的解决方案的前缀(默认为 new_
)。
此外,当前通过 SDK 连接的首选方法是 Microsoft.Xrm.Tooling.Connector 命名空间中的 CrmServiceClient class。
要找到它,您可以在 NuGet 中搜索 "Xrm Tooling"。
此外,如果您要将结果转换为自定义 InvoicesModel class,您可能需要查看 Early Bound 编程风格,您可以在其中使用工具自动生成代理classes 包含您的 D365 实体的属性。这避免了为从系统检索的数据创建自己的 "model" classes 的需要。
这是一个工作示例,可以让您了解一些可能性:
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;
}
我在使用以下代码时遇到上述错误。
我在某处读到说我应该删除所有对 Microsoft.Crm.Sdk.dll
的引用,但这没有用。如果可以请帮忙。
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;
}
}
}
}
尝试清理 -> 重建。没有必要删除引用,您可以使用全名代替 Microsoft.Xrm.Sdk.Query.QueryExpression query = new Microsoft.Xrm.Sdk.Query.QueryExpression(){};
您的列集中似乎有无效的列名。
"customer"
应该是 "customerid"
.
"invoicename"
应该是 "name"
.
"adminfee"
、"commission"
和 "paymentreceived"
等自定义字段将始终具有基于创建它们的解决方案的前缀(默认为 new_
)。
此外,当前通过 SDK 连接的首选方法是 Microsoft.Xrm.Tooling.Connector 命名空间中的 CrmServiceClient class。
要找到它,您可以在 NuGet 中搜索 "Xrm Tooling"。
此外,如果您要将结果转换为自定义 InvoicesModel class,您可能需要查看 Early Bound 编程风格,您可以在其中使用工具自动生成代理classes 包含您的 D365 实体的属性。这避免了为从系统检索的数据创建自己的 "model" classes 的需要。
这是一个工作示例,可以让您了解一些可能性:
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;
}