FetchXML - 通过 N:N 查找未链接到特定记录的记录

FetchXML - Find records not linked to specific record via N:N

有许多帖子用于查找 "not-in" 以查找与记录类型 b 没有关联的类型 a 的记录。

我想在我的场景中扩展它我有一个数据库记录类型和一个服务器升级记录类型,它们之间有一个 N:N。 (数据库和服务器之间有一个 N:N,但这不是该查询的一部分)

我想查找尚未链接到我正在进行的特定服务器升级的所有数据库记录。我的尝试失败了,因为数据库可以链接到其他服务器升级记录

<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="true" >
  <entity name="dsg_databases" >
    <attribute name="dsg_databasesid" />
    <filter type="and" >
      <condition entityname="ae" attribute="dsg_serverupgradeid" operator="neq" value="25dbe565-f435-e911-a976-000d3a2bcd97" />
    </filter>
    <link-entity name="dsg_dsg_serverupgrade_dsg_databases" from="dsg_databasesid" to="dsg_databasesid" link-type="outer" intersect="true" >
      <link-entity name="dsg_serverupgrade" from="dsg_serverupgradeid" to="dsg_serverupgradeid" link-type="outer" alias="ae" />
    </link-entity>
  </entity>
</fetch>

原因是,在一个插件中,我将这些数据库与服务器升级记录相关联,但如果它们已经链接,则会出现错误 Cannot insert duplicate key

作为参考,如果有更好的方法,我将 FetchXML 返回的实体集合转换为 EntityReferenceCollection ercDatabases 并使用 service.Associate(targetEntity.LogicalName, targetEntity.Id, relationship, ercDatabases);

编辑 - 我试图避免循环遍历返回的每条数据库记录并检查它们是否关联。我宁愿在单个查询中执行此操作以提高性能。

将您要排除的记录 ID 的过滤条件移动到相交实体(确保它是外部连接)并忽略对实际服务器升级记录的第二个连接,然后在主实体过滤器中设置条件指向连接记录检查 null 似乎有效

<fetch top="50" >
  <entity name="dsg_databases" >
    <attribute name="dsg_databasesid" />
    <attribute name="dsg_name" />
    <filter type="and" >
      <condition entityname="ae" attribute="dsg_serverupgradeid" operator="null" />
    </filter>
    <link-entity name="dsg_dsg_databases_dsg_server" from="dsg_databasesid" to="dsg_databasesid" visible="false" intersect="true" >
      <link-entity name="dsg_server" from="dsg_serverid" to="dsg_serverid" alias="ad" >
        <filter type="and" >
          <condition attribute="dsg_serverid" operator="eq" value="98f46447-7f7b-e811-a95a-000d3a22cba0" />
        </filter>
      </link-entity>
    </link-entity>
    <link-entity name="dsg_dsg_serverupgrade_dsg_databases" from="dsg_databasesid" to="dsg_databasesid" link-type="outer" intersect="true" alias="ae" >
      <filter type="and" >
        <condition attribute="dsg_serverupgradeid" operator="eq" value="25dbe565-f435-e911-a976-000d3a2bcd97" />
      </filter>
    </link-entity>
  </entity>
</fetch>