Веб-api CRM расширяется вместе с фильтром — внутреннее соединение или левое соединение?

#asp.net-web-api #dynamics-crm #dynamics-crm-webapi

#asp.net-web-api #dynamics-crm #dynamics-crm-webapi

Вопрос:

Я пытаюсь использовать запрос веб-api и без fetchxml мне удалось создать эту конечную точку, но результирующий набор ведет себя как ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ, но мне нужно ВНУТРЕННЕЕ СОЕДИНЕНИЕ.

new_demo выполняется поиск new_currentappointment (здесь записывается самая последняя запись из списка подсетей), new_currentappointment выполняется new_user поиск.

Мне нужен список, new_demo с new_currentappointment_lookup где new_user_lookup находится фильтр.

 https://crmdev.crm.dynamics.com/api/data/v9.1/new_demo?$select=new_attribute_oneamp;$expand=new_currentappointment_lookup($select=new_attribute_two;$filter=_new_user_lookup_value eq <guid>)
  

Результатом является приведение всех new_demo к системе, но фильтр расширения приводит только к нулевому результату. Как исключить отфильтрованный нулевой результат из расширенного объекта в основном результате?

 "value": [
    {
      "@odata.etag": "W/"608177550"",
      "new_attribute_one": "Demo 1",
    
      "new_currentappointment_lookup": {
        "new_attribute_two": "testing comments",
        "_new_user_lookup_value": "guid",
      },
    },
    {
      "@odata.etag": "W/"608177790"",
      "new_attribute_one": "Demo 2",
      
      "new_currentappointment_lookup": null,
    }
  ]
  

Этот результат объясняется в ASP.NET документация по веб-api — это то, что я ищу, но я не смог найти ее для веб-api Dynamics CRM. Какой-либо другой простой способ, которого мне не хватает?

Комментарии:

1. Продолжается обсуждение проблемы с github — github.com/MicrosoftDocs/powerapps-docs/issues/1692

Ответ №1:

Из отзыва в документе: CRM web api расширяется вместе с фильтром — внутренним соединением или левым соединением?

Это эквивалентный запрос для вашего сценария:

 {{webapiurl}}incidents?$select=title
amp;$expand=customerid_account($select=name;
$expand=primarycontactid($select=fullname;
$filter=contactid eq '384d0f84-7de6-ea11-a817-000d3a122b89'))
  

$ filter просто определяет, расширяется запись или нет.

В этом разница между:

 {
    "@odata.etag": "W/"31762030"",
    "title": "Sample Case",
    "incidentid": "d3d685f9-cddd-ea11-a813-000d3a122b89",
    "customerid_account": {
        "name": "Fourth Coffee",
        "accountid": "ccd685f9-cddd-ea11-a813-000d3a122b89",
        "primarycontactid": {
            "fullname": "Charlie Brown",
            "contactid": "384d0f84-7de6-ea11-a817-000d3a122b89"
        }
    }
}
  

И это:

 {
    "@odata.etag": "W/"31762030"",
    "title": "Sample Case",
    "incidentid": "d3d685f9-cddd-ea11-a813-000d3a122b89",
    "customerid_account": {
        "name": "Fourth Coffee",
        "accountid": "ccd685f9-cddd-ea11-a813-000d3a122b89",
        "primarycontactid": null
    }
}
  

Смотрите этот пример (Ctrl F «Вложенный фильтр в расширении»), где возвращаются все пользователи, но расширяются только поездки, соответствующие $ filter.

Таким образом, поведение $ filter в расширении будет просто определять, будут ли возвращены сведения или нет. Это не поведение ВНУТРЕННЕГО соединения. Для достижения этого вам нужно будет использовать FetchXML.

Комментарии:

1. Да, похожая структура. Если это можно протестировать и с этой схемой, то она может вести себя так же. Вы хотите, чтобы я проверил?

2. Спасибо, что разъяснил это как ожидаемое поведение. И FetchXML — единственный способ для внутреннего соединения.

Ответ №2:

Возможно, раньше это было невозможно, но теперь можно получить поведение ВНУТРЕННЕГО соединения через веб-API для отношений глубиной в один уровень, добавив фильтр верхнего уровня к свойству навигации. Для вашего примера это будет выглядеть так:

https://crmdev.crm.dynamics.com/api/data/v9.1/new_demo?$select=new_attribute_oneamp;$filter=(new_currentappointment_lookup/_new_user_lookup_value eq <guid>)amp;$expand=new_currentappointment_lookup($select=new_attribute_two)

Отличное место для помощи в создании запросов веб-API — это инструмент FetchXML Builder в XrmToolbox. Создайте свой запрос в fetch, а затем в меню View включите опцию OData 4.0, и он покажет вам эквивалентный запрос Web API (если это возможно).

Комментарии:

1. Для этого требуется больше положительных отзывов. Я думал, что мне придется переписать часть моего PCF, чтобы вместо этого использовать FecthXml, но это находка.

2. Это все еще не ведет себя как ВНУТРЕННЕЕ СОЕДИНЕНИЕ. Если для new_currentappointment_lookup/_new_user_lookup_value eq <guid> нет совпадающих строк, я все равно получаю запись в результате.