Как мне запросить связь n: n из MS Dynamics CRM через SOAP?

Мне нужно добавить несколько связанных сущностей в запрос SOAP в Dynamics 365 CRM (версия, о которой он сообщает, Version 1612 (8.2.1.176) (DB 8.2.1.176)). Клиентская реализация находится на PHP.

С помощью проб и ошибок и множества примеров я смог составить что-то вроде следующего тела запроса. (Я не уверен, что это лучший способ структурировать запрос; кажется, есть несколько других, включая <fetch>, но этот пока работает.)

<Execute xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services" xmlns:si="http://www.w3.org/2001/XMLSchema-instance">
  <request xmlns:c="http://schemas.microsoft.com/xrm/2011/Contracts" si:type="c:RetrieveMultipleRequest">
    <c:Parameters xmlns:c2="http://schemas.datacontract.org/2004/07/System.Collections.Generic">
      <c:KeyValuePairOfstringanyType>
        <c2:key>Query</c2:key>
        <c2:value si:type="c:QueryExpression">
          <c:ColumnSet>
            <c:AllColumns>true</c:AllColumns>
            <c:Columns/>
          </c:ColumnSet>
          <c:EntityName>entity1</c:EntityName>
          <c:LinkEntities>
            <c:LinkEntity>
              <c:LinkFromAttributeName>entity2id</c:LinkFromAttributeName>
              <c:LinkFromEntityName>entity1</c:LinkFromEntityName>
              <c:LinkToAttributeName>entity2id</c:LinkToAttributeName>
              <c:LinkToEntityName>entity2</c:LinkToEntityName>
              <c:JoinOperator>Inner</c:JoinOperator>
              <c:LinkEntities>
                <c:LinkEntity>
                  <c:LinkFromAttributeName>entity3id</c:LinkFromAttributeName>
                  <c:LinkFromEntityName>entity2</c:LinkFromEntityName>
                  <c:LinkToAttributeName>entity3id</c:LinkToAttributeName>
                  <c:LinkToEntityName>entity3</c:LinkToEntityName>
                  <c:JoinOperator>Inner</c:JoinOperator>
                </c:LinkEntity>
              </c:LinkEntities>
            </c:LinkEntity>
          </c:LinkEntities>
          <c:Orders>
            <c:OrderExpression>
              <c:AttributeName>name</c:AttributeName>
              <c:OrderType>Ascending</c:OrderType>
            </c:OrderExpression>
          </c:Orders>
          <c:PageInfo>
            <c:Count>1</c:Count>
            <c:PageNumber>1</c:PageNumber>
          </c:PageInfo>
        </c2:value>
      </c:KeyValuePairOfstringanyType>
    </c:Parameters>
    <c:RequestName>RetrieveMultiple</c:RequestName>
  </request>
</Execute>

(В этом случае связь выглядит как 1: n от entity1 к entity2 и n: 1 от entity2 к entity3. Фактически, entity2 содержит только внешние ключи для соединения entity1 и entity3 с некоторыми дополнительными атрибутами.)

Этот запрос, по-видимому, выполняется правильно (он выполняется без ошибок и ограничивает набор результатов в соответствии с внутренним соединением), но я получаю только столбцы из первого типа сущности.

Как мне на самом деле получить атрибуты объединенных сущностей?

Редактировать:

Я попытался добавить к элементу <c:LinkEntity> каждое из следующих действий:

<c:ColumnSet>
  <c:AllColumns>true</c:AllColumns>
</c:ColumnSet>

<c:Columns>
  <c:AllColumns>true</c:AllColumns>
</c:Columns>

<c:Columns>
  <a:string xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    attribute1
  </a:string>
</c:Columns>

<c:ColumnSet>
  <c:Columns>
    <a:string xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
      attribute1
    </a:string>
  </c:Columns>
</c:ColumnSet>

К сожалению, хотя ни один из них не вызвал ошибки, они также не изменили вывод.


person Christoph Burschka    schedule 14.11.2017    source источник
comment
Вы пробовали добавить ‹c: ColumnSet› ‹c: AllColumns› true ‹/ c: AllColumns› ‹/ c: ColumnSet› внутри ‹c: LinkEntities› ‹c: LinkEntity›?   -  person Arun Vinoth    schedule 14.11.2017
comment
Да, к сожалению, это не повлияет на ответ.   -  person Christoph Burschka    schedule 14.11.2017
comment
К сожалению, вместо ColumnSet используйте такие столбцы ‹c: Columns› ‹c: AllColumns› true ‹/ c: AllColumns› ‹/ c: Columns› внутри ‹c: LinkEntities› ‹c: LinkEntity›   -  person Arun Vinoth    schedule 14.11.2017
comment
По-прежнему не работало ... пока я не передвинул его так, чтобы сначала поставить элемент Columns перед всеми остальными дочерними элементами! (Ой, Microsoft ...) Большое спасибо! Отправьте, пожалуйста, полный ответ, чтобы я мог его принять. : D   -  person Christoph Burschka    schedule 15.11.2017
comment
Рад помочь. Просто проверьте, правильно ли я его разместил, если не стесняйтесь редактировать. Кстати, попробуйте новейшие методы, такие как fetchxml или crm web api - мыло далеко позади. Я даже не помню :)   -  person Arun Vinoth    schedule 15.11.2017


Ответы (1)


Размещение элемента Columns, как показано ниже, сработало.

<Execute xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services" xmlns:si="http://www.w3.org/2001/XMLSchema-instance">
  <request xmlns:c="http://schemas.microsoft.com/xrm/2011/Contracts" si:type="c:RetrieveMultipleRequest">
    <c:Parameters xmlns:c2="http://schemas.datacontract.org/2004/07/System.Collections.Generic">
      <c:KeyValuePairOfstringanyType>
        <c2:key>Query</c2:key>
        <c2:value si:type="c:QueryExpression">
          <c:ColumnSet>
            <c:AllColumns>true</c:AllColumns>
            <c:Columns/>
          </c:ColumnSet>
          <c:EntityName>entity1</c:EntityName>
          <c:LinkEntities>
             <c:LinkEntity>

              <c:Columns>
                <c:AllColumns>true</c:AllColumns>
              </c:Columns>

              <c:LinkFromAttributeName>entity2id</c:LinkFromAttributeName>
              <c:LinkFromEntityName>entity1</c:LinkFromEntityName>
              <c:LinkToAttributeName>entity2id</c:LinkToAttributeName>
              <c:LinkToEntityName>entity2</c:LinkToEntityName>
              <c:JoinOperator>Inner</c:JoinOperator>
              <c:LinkEntities>
                <c:LinkEntity>
                  <c:LinkFromAttributeName>entity3id</c:LinkFromAttributeName>
                  <c:LinkFromEntityName>entity2</c:LinkFromEntityName>
                  <c:LinkToAttributeName>entity3id</c:LinkToAttributeName>
                  <c:LinkToEntityName>entity3</c:LinkToEntityName>
                  <c:JoinOperator>Inner</c:JoinOperator>
                </c:LinkEntity>
              </c:LinkEntities>
            </c:LinkEntity>
          </c:LinkEntities>
          <c:Orders>
            <c:OrderExpression>
              <c:AttributeName>name</c:AttributeName>
              <c:OrderType>Ascending</c:OrderType>
            </c:OrderExpression>
          </c:Orders>
          <c:PageInfo>
            <c:Count>1</c:Count>
            <c:PageNumber>1</c:PageNumber>
          </c:PageInfo>
        </c2:value>
      </c:KeyValuePairOfstringanyType>
    </c:Parameters>
    <c:RequestName>RetrieveMultiple</c:RequestName>
  </request>
</Execute>
person Arun Vinoth    schedule 15.11.2017
comment
Почти - на самом деле это был первый дочерний элемент LinkEntity, как вы сказали ранее. - person Christoph Burschka; 15.11.2017