У меня есть запрос, который должен возвращать сущности «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>
Просто попробовал и отлично работает для меня - получил 3 строки. Можете ли вы попробовать запустить без каких-либо фильтров и посмотреть, правильно ли работают данные, которые вы используете? Я получаю 6 строк без фильтров: 4 строки, где a_id = 1, 1 где a_id = 2, 1 где a_id = 3)? – MarioZG
Здравствуйте, это crm 2011 или crm 2013? Какой накопитель? Если это crm 2011, 'external join' работает следующим образом: Если вы связываете отношения с' outer', вы будете получать «ВСЕ записи», даже если они не соответствуют вашему состоянию. – Sxntk