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

时间:2019-02-22 09:12:27

标签: dynamics-crm fetchxml notin

有很多帖子可以找到“ not in”来查找类型为a的记录,而这些记录与类型b没有关联。

我想在我的场景中对此进行扩展,我有一个数据库记录类型和一个服务器升级记录类型,它们之间是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);

编辑-我试图避免循环浏览返回的每个数据库记录,并检查它们是否相关联。我宁愿在单个查询中执行该操作。

1 个答案:

答案 0 :(得分:0)

将要尝试排除的记录id的过滤条件移动到相交实体(确保它是外部联接),并忽略第二个联接到实际服务器升级记录,然后在主实体过滤器中有一个条件指向检查空值的联接记录似乎起作用

<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>
相关问题