Dynamics crm 2011 正在尝试使用某些相关实体和其他相关实体进行查询

Dynamics crm 2011 正在尝试使用某些相关实体和其他相关实体进行查询,dynamics-crm-2011,Dynamics Crm 2011,在某些相关实体字段和其他相关实体字段上使用或时,我在创建查询时遇到一些困难。我使用QueryExpression,因为这是我最熟悉的,但如果有更好的方法,我完全支持 具体来说,我正在查询BillTo.Name或Customer.Name等于传入值的合同,并且关联合同行上的一些自定义值等于传入值。这就是我迄今为止所尝试的。问题在于,它使用and运算符而不是Or来处理BillTo名称和客户名称 QueryExpression qe=新的QueryExpression(Contract.EntityL

在某些相关实体字段和其他相关实体字段上使用或时,我在创建查询时遇到一些困难。我使用QueryExpression,因为这是我最熟悉的,但如果有更好的方法,我完全支持

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

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
    ,然后在客户端过滤结果

  • 执行两个单独的查询,一个用于客户id的内部联接,另一个用于计费客户id的内部联接,然后在客户端将它们合并


  • FilterOperator=LogicalOperator.Or
    只对过滤器中的
    ConditionExpression
    s起作用,而且因为您只设置了一个
    ConditionExpression
    ,所以它实际上没有任何作用。

    记住了这一点,我稍微更新了我的查询。我一直希望避免一次额外的旅行,但是因为有一次选项依赖于它,我决定旅行以获得传入的名称的guid,然后我可以使用它来简化主查询。我会把更新后的代码贴在主帖子的末尾,以防对其他人有所帮助。