2014-02-14 29 views
1

我在创建查询时使用某些相关实体字段或其他相关实体字段时遇到了一些困难。我使用的是QueryExpression,因为这是我最熟悉的,但如果有更好的方法来做到这一点,我完全赞成。尝试使用OR查询某些相关实体,并使用AND查询其他相关实体

具体来说,我查询的是BillTo.Name或Customer.Name等于传入值的合同,并且相关联的合同行上的一些自定义值等于传入的值。这是我到目前为止所尝试的。问题在于它使用And运算符而不是Or处理BillToName和Customer名称。

QueryExpression qe = new QueryExpression(Contract.EntityLogicalName); 

ColumnSet acctColumns = new ColumnSet("name"); 
LinkEntity acctlink = new LinkEntity("contract", "account", "customerid", "accountid", JoinOperator.Inner); 
acctlink.LinkCriteria.FilterOperator = LogicalOperator.Or; 
acctlink.LinkCriteria.AddCondition("name", ConditionOperator.Equal, CustName); 
acctlink.Columns = acctColumns; 
qe.LinkEntities.Add(acctlink); 

ColumnSet billToColumns = new ColumnSet("name"); 
LinkEntity billToLink = new LinkEntity("contract", "account", "billingcustomerid", "accountid", JoinOperator.Inner); 
billToLink.LinkCriteria.FilterOperator = LogicalOperator.Or; 
billToLink.LinkCriteria.AddCondition("name", ConditionOperator.Equal, CustName); 
billToLink.Columns = billToColumns; 
qe.LinkEntities.Add(billToLink); 

ColumnSet contractColumns = new ColumnSet("expireson"); 
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, formattedDBName); 

fe.AddCondition(ceVersion); 
fe.AddCondition(ceCust); 
fe.AddCondition(ceComp); 

qe.Criteria.AddFilter(fe); 
qe.ColumnSet = cs; 

EntityCollection contractDetails = crmService.RetrieveMultiple(qe); 

编辑 - 最终代码 这里是我最后通过达林提到的选项看完之后做的事情。

 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); 

回答

1

你有两个选择

  1. 更改InnerJoin年代到LeftOuter的,然后过滤在客户端的结果。

  2. 执行两个单独的查询,一个用于客户ID的内部联接,另一个用于帐单客户ID的内部联接,然后在客户端组合它们。

FilterOperator = LogicalOperator.Or仅适用于ConditionExpression S上的过滤器内,因为你只设置一个ConditionExpression它并没有真正做任何事情。

+0

由于这是介意,我更新了一下我的查询。我一直希望避免额外的旅行,但由于依赖它的选项之一,我决定去旅行,以获得传入名称的指导,然后我可以使用它来简化主要查询。我会在主帖末尾发布更新后的代码,以防别人帮助其他人。 –

相关问题