You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ServiceClient+QueryExpression查询Dynamics CE时属性不存在问题

解决Dynamics CE QueryExpression查询Invoice Detail时属性不存在的问题

核心问题:属性名使用错误

QueryExpression依赖Dynamics CE后端的实体元数据逻辑名称,而Web API中使用的_invoiceid_value是Web API专属的命名格式(用于标识Lookup字段的ID值),对应的QueryExpression中应该使用Lookup字段的原始逻辑名invoiceid。

修复步骤

  1. 修正查询条件中的属性名
    将代码中_invoiceid_value替换为invoiceid,示例代码如下:

    var invoiceDetailQuery = new QueryExpression("invoicedetail")
    {
        ColumnSet = new ColumnSet("invoicedetailid", "quantity", "priceperunit"),
        Criteria = new FilterExpression
        {
            Conditions = 
            {
                new ConditionExpression(
                    "invoiceid", // 这里用原始逻辑名,不是_invoiceid_value
                    ConditionOperator.Equal,
                    Guid.Parse("你的发票ID")
                )
            }
        }
    };
    var results = serviceClient.RetrieveMultiple(invoiceDetailQuery);
    
  2. 验证实体元数据(可选)
    如果不确定属性逻辑名,可直接在Dynamics CE后台确认:

    • 进入「高级设置」→「自定义」→「自定义系统」→「实体」→「发票明细」→「字段」
    • 找到关联「发票」的字段,查看其「逻辑名称」(应为invoiceid)
      也可以通过代码获取元数据验证:
    var entityMeta = serviceClient.RetrieveEntity(EntityFilters.Attributes, "invoicedetail");
    var targetAttr = entityMeta.Attributes.FirstOrDefault(a => a.RelatedEntityLogicalName == "invoice");
    if(targetAttr != null)
    {
        Console.WriteLine($"正确的属性逻辑名:{targetAttr.LogicalName}");
    }
    
  3. 排查环境/代码变更
    既然此前正常运行两年,需排查隐性变更:

    • 确认Dynamics CE最近是否有版本更新(Lookup字段逻辑名一般不会变更,但可排除)
    • 检查代码中是否误改了实体逻辑名(比如写成invoicedetails)
    • 确认是否使用了自动生成的实体类,类中属性名是否与元数据不一致

内容的提问来源于stack exchange,提问作者CNAP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 01:22:06