查询以返回与左外部联接的两个链接条件匹配的实体

本文关键字:两个 链接 条件 实体 返回 外部 查询 | 更新日期: 2023-09-27 18:30:30

我有一个查询,它应该返回"A"实体,同时具有指向实体"B"和"C"的链接,这两个链接具有"左外部连接"运算符,以便我可以从一个链接或另一个链接接收"A"实体。

执行后,它只返回一条记录,这对于两个链接条件是通用的。如果我删除指向实体"B"的链接,则我得到与链接条件匹配的预期记录。当我删除指向实体"C"的链接而存在指向实体"B"的链接时,也会发生同样的情况。

因此,我假设我的查询仅适用于一个链接,但是当有两个链接并且我不明白为什么时,它无法按预期工作。

实际上,我正在遵循此MSDN示例。

这是我的数据:

_____________
|     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);

您正在添加查询。AddLink() 并再次添加一些其他链接进行查询但使用相同的链接即查询。LinkEntities[0] 用于别名和 LinkCriteria。也许纠正这个错误可以解决你的问题。