有许多帖子用于查找“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>