在使用
ServiceClient类从 Dynamics CE 中检索基于
QueryExpression
的实体并通过特定字段对特定实体执行此操作时,我遇到了问题。
我的代码构建为使用字段
_invoiceid_value
通过其对发票的引用来检索发票产品(逻辑名称发票详细信息)。
看起来如下:
public async Task<IEnumerable<InvoiceDetail>> GetInvoiceDetailsByInvoiceIdAsync(Guid invoiceId)
{
var query = new QueryExpression(InvoiceDetail.EntityLogicalName);
query.ColumnSet = new ColumnSet(true);
query.Criteria.AddCondition("_invoiceid_value", ConditionOperator.Equal, invoiceId);
return await _repository.GetInvoiceDetailsByQueryAsync(query);
}
存储库类仅处理
ServiceClient
并且不包含任何逻辑。当 ServiceClient
发送此请求时,我收到以下错误消息:
System.Private.ServiceModel: “InvoiceDetail”实体不包含 Name =“_invoiceid_value”且 NameMapping =“Logical”的属性。
元数据缓存详细信息:ProviderType=动态,
标准缓存=真,
IsLoadedInStagingContext = False,
时间戳=170102496,
最小活动行版本=170102496,
元数据实例Id=19121005,
最后更新=2024-02-11 09:54:52.403,
组织ID=.
我读到的响应是实体“发票详细信息”不存在字段
_invoiceid_value
。问题是它确实存在,无论是在使用 Dynamics 365 的 Level up 查看 Dynamics CE 中的实体时还是在使用其 Web API 时。
我尝试向他们的 API 发出以下请求,其中组织和发票 ID 值包含正确的值:
https://organisation.api.crm4.dynamics.com/api/data/v9.2/invoicedetails?$filter=_invoiceid_value eq invoiceid
这将返回 200 OK 以及所请求的发票详细信息实体。
为什么使用 Dynamics CE Web API 可以正常工作,但当我将
ServiceClient
类与 QueryExpression
结合使用时却不起作用?
ServiceClient
类还支持对Web API的OData查询,这也有效,因此仅在使用QueryExpression
时才存在问题。过去两年我一直使用QueryExpresssion
方法,没有任何问题。
我的主要专长不是动力学,所以我可能遗漏了该组件中明显的一些东西。但考虑到它可以与 OData 查询一起使用,我不明白为什么它不能使用
QueryExpression
工作。
使用
IOrganizationService
接口(由 ServiceClient
实现)时,实体和属性名称必须由其逻辑名称指定。
因此条件
query.Criteria.AddCondition("_invoiceid_value", ConditionOperator.Equal, invoiceId);
应该这样写:
query.Criteria.AddCondition("invoiceid", ConditionOperator.Equal, invoiceId);
(
_invoiceid_value
是 OData 语法)