Выражение запроса Dynamics CRM с множественным соединением, добавление фильтра с условием ИЛИ, создающее отсутствие возврата результатов

QueryExpression Query = new QueryExpression { EntityName = "incident", ColumnSet = new ColumnSet(true) };

            LinkEntity CustomerEntity = new LinkEntity
            {
                LinkFromEntityName = "incident",
                LinkToEntityName = "account",
                LinkFromAttributeName = "customerid",
                LinkToAttributeName = "accountid",
                EntityAlias = "Customer",
                Columns = new ColumnSet("den_firstname", "den_lastname")
            };

            LinkEntity SubSubTypeEntity = new LinkEntity
            {
                LinkFromEntityName = "incident",
                LinkToEntityName = "den_subsubtype",
                LinkFromAttributeName = "den_subsubtypeid",
                LinkToAttributeName = "den_subsubtypeid",
                JoinOperator = JoinOperator.Inner,
                EntityAlias = "SubSubType",
                Columns = new ColumnSet("den_resolvedby")
            };

            Query.ColumnSet = new ColumnSet(true);

            Query.LinkEntities.Add(CustomerEntity);
            Query.LinkEntities.Add(SubSubTypeEntity);

            if (SRStatus > 0)
                Query.Criteria.AddCondition("statuscode", ConditionOperator.Equal, SRStatus);
            if (ResolutionType > 0)
                Query.Criteria.AddCondition("den_roltype", ConditionOperator.Equal, ResolutionType);

            CustomerEntity.LinkCriteria.AddCondition("den_lcouserid", ConditionOperator.Equal, lconameId);

            FilterExpression childFilter = Query.Criteria.AddFilter(LogicalOperator.Or);
            FilterExpression custFilter = CustomerEntity.LinkCriteria.AddFilter(LogicalOperator.Or);

            if (!string.IsNullOrEmpty(SearchText))
            {
                childFilter.AddCondition("den_userid", ConditionOperator.Equal, SearchText);
                childFilter.AddCondition("ticketnumber", ConditionOperator.Like, "%" + SearchText + "%");
                childFilter.AddCondition("title", ConditionOperator.Equal, SearchText);

//Ниже код создает проблему, если я удалю это, он сработает, и я получу результаты. Но мне нужно добавить оба фильтра

                custFilter.AddCondition("name", ConditionOperator.Equal, SearchText);
                custFilter.AddCondition("den_firstname", ConditionOperator.Equal, SearchText);
                //custFilter.AddCondition("den_lastname", ConditionOperator.Equal, SearchText);
                custFilter.AddCondition("emailaddress1", ConditionOperator.Equal, SearchText);
                custFilter.AddCondition("telephone1", ConditionOperator.Equal, SearchText);
            }

Если я удаляю все условия с помощью custFilter или childFilter, я получаю результат, но когда я сохраняю оба, он возвращает какие-либо результаты (без ошибок).


person Vipul    schedule 06.05.2015    source источник
comment
Вы получаете сообщение об ошибке или просто получаете 0 результатов? Что, если вы добавите по одной строке проблемного фильтра за раз?   -  person Alex    schedule 06.05.2015
comment
Я получаю 0 результатов без каких-либо ошибок. Я полагаю, что оба условия выполняются с оператором AND, в то время как я намерен использовать оператор OR.   -  person Vipul    schedule 06.05.2015


Ответы (1)


Ниже твики решили мою проблему.

QueryExpression Query = new QueryExpression { EntityName = "incident", ColumnSet = new ColumnSet(true) };

            LinkEntity CustomerEntity = new LinkEntity
            {
                LinkFromEntityName = "incident",
                LinkToEntityName = "account",
                LinkFromAttributeName = "customerid",
                LinkToAttributeName = "accountid",
                EntityAlias = "Customer",
                Columns = new ColumnSet("den_firstname", "den_lastname", "name", "accountid", "emailaddress1", "telephone1", "den_lcouserid"),
                JoinOperator = JoinOperator.Inner
            };
            CustomerEntity.LinkCriteria.AddCondition("den_lcouserid", ConditionOperator.Equal, lconameId);

            LinkEntity SubSubTypeEntity = new LinkEntity
            {
                LinkFromEntityName = "incident",
                LinkToEntityName = "den_subsubtype",
                LinkFromAttributeName = "den_subsubtypeid",
                LinkToAttributeName = "den_subsubtypeid",
                JoinOperator = JoinOperator.Inner,
                EntityAlias = "SubSubType",
                Columns = new ColumnSet("den_resolvedby")
            };            

            Query.LinkEntities.Add(CustomerEntity);
            Query.LinkEntities.Add(SubSubTypeEntity);                             

            FilterExpression incidentChildFilterOR = Query.Criteria.AddFilter(LogicalOperator.Or);
            FilterExpression incidentChildFilterAND = Query.Criteria.AddFilter(LogicalOperator.And);
            FilterExpression customerChildFilterOR = CustomerEntity.LinkCriteria.AddFilter(LogicalOperator.Or);

            if (SRStatus > 0)
                incidentChildFilterAND.AddCondition("statuscode", ConditionOperator.Equal, SRStatus);
            if (ResolutionType > 0)
                incidentChildFilterAND.AddCondition("den_roltype", ConditionOperator.Equal, ResolutionType);  

            if (!string.IsNullOrEmpty(SearchText))
            {
                if (SRStatus > 0)
                    incidentChildFilterOR.AddCondition("statuscode", ConditionOperator.Equal, SRStatus);
                if (ResolutionType > 0)
                    incidentChildFilterOR.AddCondition("den_roltype", ConditionOperator.Equal, ResolutionType); 

                incidentChildFilterOR.AddCondition("den_userid", ConditionOperator.Equal, SearchText);
                incidentChildFilterOR.AddCondition("ticketnumber", ConditionOperator.Like, "%" + SearchText + "%");
                incidentChildFilterOR.AddCondition("title", ConditionOperator.Equal, SearchText);


                customerChildFilterOR.AddCondition("name", ConditionOperator.Equal, SearchText);
                customerChildFilterOR.AddCondition("den_firstname", ConditionOperator.Equal, SearchText);
                customerChildFilterOR.AddCondition("den_lastname", ConditionOperator.Equal, SearchText);
                customerChildFilterOR.AddCondition("emailaddress1", ConditionOperator.Equal, SearchText);
                customerChildFilterOR.AddCondition("telephone1", ConditionOperator.Equal, SearchText);
            }
person Vipul    schedule 07.05.2015