Dynamics crm 2011 正在尝试使用某些相关实体和其他相关实体进行查询
在某些相关实体字段和其他相关实体字段上使用或时,我在创建查询时遇到一些困难。我使用QueryExpression,因为这是我最熟悉的,但如果有更好的方法,我完全支持 具体来说,我正在查询BillTo.Name或Customer.Name等于传入值的合同,并且关联合同行上的一些自定义值等于传入值。这就是我迄今为止所尝试的。问题在于,它使用and运算符而不是Or来处理BillTo名称和客户名称Dynamics crm 2011 正在尝试使用某些相关实体和其他相关实体进行查询,dynamics-crm-2011,Dynamics Crm 2011,在某些相关实体字段和其他相关实体字段上使用或时,我在创建查询时遇到一些困难。我使用QueryExpression,因为这是我最熟悉的,但如果有更好的方法,我完全支持 具体来说,我正在查询BillTo.Name或Customer.Name等于传入值的合同,并且关联合同行上的一些自定义值等于传入值。这就是我迄今为止所尝试的。问题在于,它使用and运算符而不是Or来处理BillTo名称和客户名称 QueryExpression qe=新的QueryExpression(Contract.EntityL
QueryExpression qe=新的QueryExpression(Contract.EntityLogicalName);
ColumnSet acctColumns=新列集(“名称”);
LinkEntity acctlink=新的LinkEntity(“合同”、“账户”、“客户ID”、“账户ID”、JoinOperator.Inner”);
acctlink.LinkCriteria.FilterOperator=LogicalOperator.Or;
acctlink.LinkCriteria.AddCondition(“名称”,ConditionOperator.Equal,CustName);
acctlink.Columns=acctColumns;
qe.linkenties.Add(acctlink);
ColumnSet billToColumns=新列集(“名称”);
LinkEntity billToLink=新的LinkEntity(“合同”、“账户”、“billingcustomerid”、“账户ID”、JoinOperator.Inner);
billToLink.LinkCriteria.FilterOperator=LogicalOperator.Or;
billToLink.LinkCriteria.AddCondition(“名称”,ConditionOperator.Equal,CustName);
billToLink.Columns=billToColumns;
qe.LinkEntities.Add(billToLink);
ColumnSet contractColumns=新列集(“到期日”);
LinkEntity contractLineLink=新的LinkEntity(“合同”、“合同细节”、“收缩”、“收缩”,JoinOperator.Inner);
contractLineLink.Columns=contractColumns;
LinkEntity productLink=新的LinkEntity(“合同详细信息”、“产品”、“产品ID”、“产品ID”、JoinOperator.Inner);
productLink.LinkCriteria.AddCondition(“productnumber”,ConditionOperator.Equal,ProductID);
contractLineLink.LinkEntities.Add(productLink);
qe.LinkEntities.Add(contractLineLink);
FilterExpression fe=新的FilterExpression(LogicalOperator.And);
ConditionExpression ceVersion=新的ConditionExpression(“新版本”,ConditionOperator.Equal,versionID);
ConditionExpression ceCust=new ConditionExpression(“new_cust”,ConditionOperator.Equal,true);
ConditionExpression ceComp=new ConditionExpression(“new_comp”,ConditionOperator.Like,formattedDBName);
fe.附加条件(CEV版);
fe.附加条件(ceCust);
fe.附加条件(ceComp);
qe.标准.添加过滤器(fe);
qe.ColumnSet=cs;
EntityCollection contractDetails=crmService.RetrieveMultiple(qe);
编辑-最终代码
下面是我在阅读了Darin提到的选项后最后做的事情
Guid acctGuid = acctRef.Id; // Retrieve EntityReference in another method
ColumnSet cs = new ColumnSet();
QueryExpression qe = new QueryExpression(Contract.EntityLogicalName);
ColumnSet contractColumns = new ColumnSet("expireson", "new_registrationkey");
LinkEntity contractLineLink = new LinkEntity("contract", "contractdetail", "contractid", "contractid", JoinOperator.Inner);
contractLineLink.Columns = contractColumns;
LinkEntity productLink = new LinkEntity("contractdetail", "product", "productid", "productid", JoinOperator.Inner);
productLink.LinkCriteria.AddCondition("productnumber", ConditionOperator.Equal, ProductID);
contractLineLink.LinkEntities.Add(productLink);
qe.LinkEntities.Add(contractLineLink);
FilterExpression fe = new FilterExpression(LogicalOperator.And);
ConditionExpression ceVersion = new ConditionExpression("new_version", ConditionOperator.Equal, VersionID);
ConditionExpression ceCust = new ConditionExpression("new_cust", ConditionOperator.Equal, true);
ConditionExpression ceComp = new ConditionExpression("new_comp", ConditionOperator.Like, formattedName);
fe.AddCondition(ceVersion);
fe.AddCondition(ceCust);
fe.AddCondition(ceComp);
qe.Criteria.AddFilter(fe);
qe.ColumnSet = cs;
FilterExpression fe2 = new FilterExpression(LogicalOperator.Or);
ConditionExpression ceCustomerName = new ConditionExpression("customerid", ConditionOperator.Equal, acctGuid);
ConditionExpression ceBillToName = new ConditionExpression("billingcustomerid", ConditionOperator.Equal, acctGuid);
fe2.AddCondition(ceCustomerName);
fe2.AddCondition(ceBillToName);
qe.Criteria.AddFilter(fe2);
EntityCollection contractDetails = crmService.RetrieveMultiple(qe);
你有两个选择
InnerJoin
更改为LeftOuter
,然后在客户端过滤结果FilterOperator=LogicalOperator.Or
只对过滤器中的ConditionExpression
s起作用,而且因为您只设置了一个ConditionExpression
,所以它实际上没有任何作用。记住了这一点,我稍微更新了我的查询。我一直希望避免一次额外的旅行,但是因为有一次选项依赖于它,我决定旅行以获得传入的名称的guid,然后我可以使用它来简化主查询。我会把更新后的代码贴在主帖子的末尾,以防对其他人有所帮助。