Можете ли вы написать один запрос FetchXML, чтобы получить 1: многие отношения?
-
03-10-2019 - |
Вопрос
Можно ли написать один запрос FetchXML, который получает корневой объект и несколько детей? Все, что я смог сделать, это 1: 1.
Решение
Нет, это невозможно.
Другие советы
Джеймс Дерево правильно. Отказ Fetch XML рекурсивна, поэтому, используя ссылку, вы можете получить нужную информацию.
Например, следующее действительно:
<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="true">
<entity name="account">
<attribute name="name" />
<attribute name="primarycontactid" />
<attribute name="telephone1" />
<attribute name="accountid" />
<order attribute="name" descending="false" />
<link-entity name="contact" from="parentcustomerid" to="accountid" alias="aj">
<attribute name="firstname" />
<attribute name="lastname" />
<attribute name="telephone1" />
<link-entity name="businessunit" from="businessunitid" to="owningbusinessunit" alias="ak">
<attribute name="name" />
<attribute name="address1_line1" />
<attribute name="address1_line2" />
<attribute name="address1_line3" />
<filter type="and">
<condition attribute="name" operator="not-null" />
</filter>
</link-entity>
</link-entity>
</entity>
</fetch>
Если ваш вопрос действительно «возможно, можно ли написать один запрос FetchXML, который получает ОДИН root-объект и несколько детей "Тогда ответ, к сожалению, нет. Однако, если вы можете обрабатывать дубликаты корневых данных (например, использование функциональности группировки отчета SSRS), то то, что вам требуется, полностью возможен
Если я не понял вопроса, это очень возможно.
Таким образом, например, вы хотите найти все контакты, связанные с данной учетной записью. Это представлено в CRM на поиск родителей клиента на контакте на счет.
<fetch mapping="logical" count="100" version="1.0">
<entity name="account">
<attribute name="name" />
<link-entity name="contact" from="parentcustomerid" to="accountid">
<attribute name="fullname" />
</link-entity>
</entity>
</fetch>
Что дает вам набор результатов, который выглядит так:
<resultset morerecords="0" paging-cookie="<cookie page="1"><accountid last="{E704FAD6-2D4B-E111-9FED-00155D828444}" first="{AD912122-6B3C-E111-9B37-00155D828444}" /></cookie>">
<result>
<name>RGD Mining Inc</name>
<accountid>{E704FAD6-2D4B-E111-9FED-00155D828444}</accountid>
<accountid.fullname>Bill Miner</accountid.fullname>
</result>
<result>
<name>RGD Mining Inc</name>
<accountid>{E704FAD6-2D4B-E111-9FED-00155D828444}</accountid>
<accountid.fullname>Green</accountid.fullname>
</result>
</resultset>
Я рад сообщить, что это возможно. У меня есть решение, которое хорошо работало для меня.
Единственное предостережение заключается в том, что если у вас есть несколько дочерних аккаунтов, вы получите несколько результатов для родителя. Например:
parent 1: child 1
parent 2: child 1
parent 2: child 2
Это означает, что вам тогда придется запустить результаты через функцию сортировки, чтобы либо все дети под родителями в многомерном массиве, либо получают все аккаунты как уникальные записи в плоский массив.
Кроме того, это только снижает один уровень. Если ваша иерархия многоуровневая, этот код должен быть изменен.
<fetch distinct="false" mapping="logical">
<entity name="account">
<attribute name="name" />
<link-entity name="account" alias="childaccount" to="accountid" from="parentaccountid" link-type="outer">
<attribute name="name" alias="childname" />
</link-entity>
</entity>
</fetch>