C# 查询以返回与具有左外部联接的两个链接标准匹配的实体
我有一个查询,当链接到实体“B”和“C”时,应该返回“a”实体,这两个链接有“左外连接”操作符,这样我可以从一个链接或另一个链接接收“a”实体 执行后,它只返回一条记录,这是两个链接标准的通用记录。如果删除到实体“B”的链接,则会得到与链接条件匹配的预期记录。当我在实体“B”的链接存在时删除到实体“C”的链接时,也会发生同样的情况 所以,我假设我的查询只对一个链接有效,但当有两个链接时,它就不能像预期的那样工作,我不明白为什么 事实上我一直在关注这个 以下是我的数据:C# 查询以返回与具有左外部联接的两个链接标准匹配的实体,c#,dynamics-crm-2011,dynamics-crm,dynamics-crm-2013,C#,Dynamics Crm 2011,Dynamics Crm,Dynamics Crm 2013,我有一个查询,当链接到实体“B”和“C”时,应该返回“a”实体,这两个链接有“左外连接”操作符,这样我可以从一个链接或另一个链接接收“a”实体 执行后,它只返回一条记录,这是两个链接标准的通用记录。如果删除到实体“B”的链接,则会得到与链接条件匹配的预期记录。当我在实体“B”的链接存在时删除到实体“C”的链接时,也会发生同样的情况 所以,我假设我的查询只对一个链接有效,但当有两个链接时,它就不能像预期的那样工作,我不明白为什么 事实上我一直在关注这个 以下是我的数据: _____________
_____________
| 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);
查询表达式转换为以下提取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>
我希望您的代码中有一些编程错误。
看看你的代码部分
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()并再次向查询添加其他链接
但对别名和LinkCriteria使用相同的链接ie query.LinkEntities[0]。
也许纠正这个错误可以解决您的问题。刚刚尝试过,对我来说效果很好-得到3行。您是否可以尝试在没有任何筛选器的情况下运行,并查看您运行的数据是否正确(我得到6行没有筛选器的数据:4行a_id=1,1行a_id=2,1行a_id=3)?您好,这是crm 2011还是crm 2013?三明治卷?如果这是crm 2011外部连接
的工作方式:如果您将关系链接到外部
,您将检索所有记录
,即使它们与您的条件不匹配。