2014-11-14 1 views
1

У меня есть запрос, который должен возвращать сущности «A», имея ссылки на объекты «B» и «C», и эти две ссылки имеют оператор «Left Outer Join» так что я могу получать объекты «А» либо с одной ссылки, либо с другой.Запрос для возврата сущностей, которые соответствуют двум критериям ссылки с Left Outer Join

После выполнения он возвращает мне только одну запись, которая является общей для двух из критериев ссылки. Если я удалю ссылку на объект «B», тогда получаю ожидаемые записи, соответствующие критериям ссылки. То же самое происходит, когда я удаляю ссылку на объект «C», пока присутствует ссылка на объект «B».

Итак, я предполагаю, что мой запрос работает только с одной ссылкой, но он работает не так, как ожидалось, когда есть две ссылки, и я не понимаю, почему.

На самом деле я следил за этим MSDN example.

Вот мои данные:

_____________ 
|  A  | 
------------- 
| a_id | 
|  1  | - entity with this id is the only record in the results 
|  2  | - entity with this id should appear in the results, but it is not 
|  3  | - entity with this id should appear in the results, but it is not 

_________________________________ 
|    B    | 
--------------------------------- 
| b_one_id | b_two_id | 
|  1  |  1  | - matches link criteria with alias "connectionB" 
|  2  |  1  | - matches link criteria with alias "connectionB" 
|  1  |  444  | - doesn't match link criteria, should not appear 

_________________________________ 
|    C    | 
--------------------------------- 
| c_one_id | c_two_id | 
|  1  |  2  | - matches link criteria with alias "connectionC" 
|  3  |  2  | - matches link criteria with alias "connectionC" 
|  1  |  555  | - doesn't match link criteria, should not appear 

Мое выражение запроса:

QueryExpression query = new QueryExpression 
{ 
    EntityName = A.EntityLogicalName, 
    ColumnSet = new ColumnSet 
    { 
     AllColumns = false, 
     Columns = 
     { 
      "a_id", 
      "a_name" 
     } 
    } 
}; 

query.Distinct = true; 

query.AddLink(B.EntityLogicalName, "a_id", "b_one_id", JoinOperator.LeftOuter); 
query.LinkEntities[0].EntityAlias = "connectionB"; 
query.LinkEntities[0].LinkCriteria.AddCondition("b_two_id", ConditionOperator.Equal, 1); 

query.AddLink(C.EntityLogicalName, "a_id", "c_one_id", JoinOperator.LeftOuter); 
query.LinkEntities[0].EntityAlias = "connectionC"; 
query.LinkEntities[0].LinkCriteria.AddCondition("c_two_id", ConditionOperator.Equal, 2); 

// doesn't work as expected 
query.Criteria.AddFilter(LogicalOperator.Or); 
query.Criteria.Filters[0].AddCondition("connectionB", "b_one_id", ConditionOperator.NotNull); 
query.Criteria.Filters[0].AddCondition("connectionC", "c_one_id", ConditionOperator.NotNull); 

// doesn't work as expected either 
query.Criteria.AddCondition("a_id", ConditionOperator.NotNull); 

Выражение запроса преобразуется в следующий Fetch XML запрос:

<fetch distinct="true" no-lock="false" mapping="logical"> 
    <entity name="A"> 
     <attribute name="a_id" /> 
     <attribute name="a_name" /> 
     <filter type="and"> 
      <filter type="or"> 
       <!-- doesn't work as expected --> 
       <condition attribute="b_one_id" operator="not-null" entityname="connectionB" /> 
       <condition attribute="c_one_id" operator="not-null" entityname="connectionC" /> 

       <!-- doesn't work as expected either --> 
       <condition attribute="a_id" operator="not-null" entityname="A" /> 
      </filter> 
     </filter> 
     <link-entity name="B" to="a_id" from="b_one_id" link-type="outer" alias="connectionB"> 
      <filter type="and"> 
       <condition attribute="b_two_id" operator="eq" value="1" /> 
      </filter> 
     </link-entity> 
     <link-entity name="C" to="a_id" from="c_one_id" link-type="outer" alias="connectionC"> 
      <filter type="and"> 
       <condition attribute="c_two_id" operator="eq" value="2" /> 
      </filter> 
     </link-entity> 
    </entity> 
</fetch> 
+0

Просто попробовал и отлично работает для меня - получил 3 строки. Можете ли вы попробовать запустить без каких-либо фильтров и посмотреть, правильно ли работают данные, которые вы используете? Я получаю 6 строк без фильтров: 4 строки, где a_id = 1, 1 где a_id = 2, 1 где a_id = 3)? – MarioZG

+0

Здравствуйте, это crm 2011 или crm 2013? Какой накопитель? Если это crm 2011, 'external join' работает следующим образом: Если вы связываете отношения с' outer', вы будете получать «ВСЕ записи», даже если они не соответствуют вашему состоянию. – Sxntk

ответ

0

Я надеюсь Существует несколько программ ошибка в вашем коде. Посмотрите на свой код Часть

query.AddLink(B.EntityLogicalName, "a_id", "b_one_id", JoinOperator.LeftOuter); 
query.LinkEntities[0].EntityAlias = "connectionB"; 
query.LinkEntities[0].LinkCriteria.AddCondition("b_two_id", ConditionOperator.Equal, 1); 

query.AddLink(C.EntityLogicalName, "a_id", "c_one_id", JoinOperator.LeftOuter); 
query.LinkEntities[0].EntityAlias = "connectionC"; 
query.LinkEntities[0].LinkCriteria.AddCondition("c_two_id", ConditionOperator.Equal, 2); 

Вы добавляете query.AddLink() и снова Добавление некоторых других Ссылка на запрос , но с помощью той же ссылке т.е. query.LinkEntities [0] для Alias, и LinkCriteria. Возможно, исправление этой ошибки может решить вашу проблему.