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
相关产品推荐
相关产品推荐

