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

CRMSDK QueryExpression未返回全部关联属性的环境相关问题求助

QueryExpression查询部分属性缺失问题排查

问题描述

基于CRMSDK和.NET Framework 4.6.2构建的Azure Function,使用QueryExpression查询company_cpseventdocketline实体时,仅返回2个字段,另外3个已确认有值的属性缺失。但将该QueryExpression转换为FetchXML后在XrmToolBox中可正常获取全部数据;切换到其他CRM环境时,QueryExpression也能返回所有属性,推测问题与当前环境相关,期望QueryExpression能返回所有指定属性。

相关代码

public IEnumerable<ReadyDocketLineDto> GetDocketLinesToBeProcessed()
{
    var qryDocketLine = new QueryExpression(company_cpseventdocketline.EntityLogicalName);

    #region get docket line
    qryDocketLine.ColumnSet.AddColumns(
        company_cpseventdocketline.Fields.Id,
        company_cpseventdocketline.Fields.company_docketlinetypecode,
        company_cpseventdocketline.Fields.company_paymentclassificationid,
        company_cpseventdocketline.Fields.company_name,
        company_cpseventdocketline.Fields.company_amountincludingGST,
        company_cpseventdocketline.Fields.company_amountexcludingGST,
        company_cpseventdocketline.Fields.company_cpseventdocketid,
        company_cpseventdocketline.Fields.CreatedBy,
        company_cpseventdocketline.Fields.company_recharge_nonbillable,
        company_cpseventdocketline.Fields.CreatedOn,
        company_cpseventdocketline.Fields.company_classificationreason
        );

    qryDocketLine.Criteria.AddCondition(company_cpseventdocketline.Fields.StatusCode, ConditionOperator.Equal, (int)company_cpseventdocketline_StatusCode.Ready);
    qryDocketLine.Criteria.AddCondition(company_cpseventdocketline.Fields.company_cpseventdocketid, ConditionOperator.NotNull);
    qryDocketLine.Criteria.AddCondition(company_cpseventdocketline.Fields.company_name, ConditionOperator.Equal, "DLN-0003995255");
    #endregion

    #region link to docket
    var lnkDocketLineToDocket = qryDocketLine.AddLink(
        company_cpseventdocket.EntityLogicalName,
        company_cpseventdocketline.Fields.company_cpseventdocketid,
        company_cpseventdocket.Fields.Id,
        JoinOperator.LeftOuter
        );

    lnkDocketLineToDocket.EntityAlias = "docket";

    lnkDocketLineToDocket.Columns.AddColumns(
        company_cpseventdocket.Fields.company_OutFreeDistance,
        company_cpseventdocket.Fields.company_OutExcessDistance,
        company_cpseventdocket.Fields.company_TowFreeDistance,
        company_cpseventdocket.Fields.company_TowExcessDistance,
        company_cpseventdocket.Fields.company_calculatedattendancedistance,
        company_cpseventdocket.Fields.company_calculatedtowingdistance,
        company_cpseventdocket.Fields.company_docketnumber,
        company_cpseventdocket.Fields.company_eventdispositioncodes,
        company_cpseventdocket.Fields.company_customerid,
        company_cpseventdocket.Fields.company_accountid,
        company_cpseventdocket.Fields.company_suburb,
        company_cpseventdocket.Fields.CreatedBy,
        company_cpseventdocket.Fields.company_cpsmemberclubid,
        company_cpseventdocket.Fields.company_cpsprogramid,
        company_cpseventdocket.Fields.company_cpsproductid,
        company_cpseventdocket.Fields.company_vehicleregistration,
        company_cpseventdocket.Fields.company_eventoccurredon,
        company_cpseventdocket.Fields.company_CPSeventid
    );

    #endregion

    #region link to agreement
    var lnkDocketLineToAgreement = qryDocketLine.AddLink(
       company_vendoragreement.EntityLogicalName,
       company_cpseventdocketline.Fields.company_agreementid,
       company_vendoragreement.Fields.Id,
       JoinOperator.LeftOuter);

    lnkDocketLineToAgreement.EntityAlias = "agreement";

    lnkDocketLineToAgreement.Columns.AddColumns(
        company_vendoragreement.PrimaryNameAttribute,
        company_vendoragreement.Fields.company_DAXVendorID,
        company_vendoragreement.Fields.StateCode,
        company_vendoragreement.Fields.StatusCode,
        company_vendoragreement.Fields.company_teamsupplier);
    #endregion

    #region link to vendor
    var lnkDocketLineToAgreementToVendor = lnkDocketLineToAgreement.AddLink(
        company_vendor.EntityLogicalName,
        company_vendoragreement.Fields.company_vendorid,
        company_vendor.Fields.Id,
        JoinOperator.LeftOuter);

    lnkDocketLineToAgreementToVendor.EntityAlias = "vendor";

    lnkDocketLineToAgreementToVendor.Columns.AddColumns(company_vendor.Fields.company_gstapplicable);

    #endregion

    #region link to payment classification
    var lnkDocketLineToPaymentClassification = qryDocketLine.AddLink(
        company_paymentclassification.EntityLogicalName,
        company_cpseventdocketline.Fields.company_paymentclassificationid,
        company_paymentclassification.Fields.company_paymentclassificationId,
        JoinOperator.LeftOuter);

    lnkDocketLineToPaymentClassification.EntityAlias = "classificationcode";

    lnkDocketLineToPaymentClassification.Columns.AddColumns(
        company_paymentclassification.Fields.company_name,
        company_paymentclassification.Fields.company_paymentclassificationId,
        company_paymentclassification.Fields.company_glaccount,
        company_paymentclassification.Fields.company_classificationcode,
        company_paymentclassification.Fields.company_nonbillableglaccount
    );
    #endregion

    #region  link to system user who created the docketline
    var linkDocketLineToSystemUser = qryDocketLine.AddLink(
        SystemUser.EntityLogicalName,
        company_cpseventdocketline.Fields.CreatedBy,
        SystemUser.PrimaryIdAttribute,
        JoinOperator.LeftOuter
        );
    linkDocketLineToSystemUser.EntityAlias = "systemuser";
    linkDocketLineToSystemUser.Columns.AddColumns(SystemUser.Fields.DomainName);

    #endregion

    #region get the DAX transaction mappings
    List<company_cpsdaxtransactionmapping> daxTxnMappings = new List<company_cpsdaxtransactionmapping>();

    var qryDaxTxnMappings = new QueryExpression(company_cpsdaxtransactionmapping.EntityLogicalName);
    qryDaxTxnMappings.Criteria.AddCondition(company_cpsdaxtransactionmapping.Fields.StateCode, ConditionOperator.Equal, (int)company_cpsdaxtransactionmappingState.Active);
    qryDaxTxnMappings.ColumnSet = new ColumnSet(true);

    var results = organisationService.RetrieveMultiple(qryDaxTxnMappings);
    daxTxnMappings = results.Entities.Cast<company_cpsdaxtransactionmapping>().ToList();
    #endregion

    #region link to the extgernal system reference to get the dax customer id
    var lnkDocketToExternalSystemReference = lnkDocketLineToDocket.AddLink(
        company_externalsystemreference.EntityLogicalName,
        company_cpseventdocket.Fields.company_accountid,
        company_externalsystemreference.Fields.company_Customer,
        JoinOperator.LeftOuter
        );
    lnkDocketToExternalSystemReference.EntityAlias = "externalsystemreference";
    lnkDocketToExternalSystemReference.Columns.AddColumns(company_externalsystemreference.Fields.company_SystemIdentifier);
    lnkDocketToExternalSystemReference.LinkCriteria.AddCondition(new ConditionExpression(company_externalsystemreference.Fields.company_externalsystemid, ConditionOperator.Equal, company_externalsystem.RecordIds.DAXCustomer));

    #endregion

    var docketLines = bulkRequestHelper.RetrieveMultiple(qryDocketLine);

    foreach (var dl in docketLines)
    {
        yield return ConvertEntityToDocketLineDto(dl, daxTxnMappings);
    }
}

排查方向

  • 字段权限检查:确认Azure Function使用的CRM服务账号对缺失的3个属性有读取权限,部分环境可能存在字段级安全配置限制。
  • QueryExpression转FetchXML验证:通过QueryExpressionToFetchXmlRequest将代码中的QueryExpression转换为FetchXML,直接在代码中使用FetchXML执行查询,验证是否能获取完整属性,排除QueryExpression构造问题。
  • BulkRequestHelper逻辑检查:排查bulkRequestHelper.RetrieveMultiple方法是否对返回结果做了字段过滤或裁剪,自定义批量查询工具可能存在处理逻辑差异。
  • 环境元数据对比:对比问题环境和正常环境中company_cpseventdocketline实体的元数据,确认缺失属性的配置(如是否为计算字段、是否有插件拦截字段返回)。
  • 插件/工作流拦截排查:检查问题环境中是否存在针对company_cpseventdocketline实体的查询插件,插件可能修改了查询结果的字段集合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:49:53