FetchXML - поиск записей, не связанных с конкретной записью с помощью N: N - PullRequest
0 голосов
/ 22 февраля 2019

Существуют многочисленные сообщения о поиске «не в», чтобы найти записи типа 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 голосов
/ 22 февраля 2019

Перемещение условия фильтра записи, которую вы пытаетесь исключить, в пересекающуюся сущность (при условии, что это внешнее соединение) и игнорирование второго соединения с фактической записью обновления сервера, а затем условие в фильтре основной сущности, указывающее напроверка записи соединения на ноль работает

<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>
...