Odata CRM 2016 расширяет коллекцию

Я пытаюсь получить несколько данных из нового REST API, но у меня странная проблема. Если я использую $expand для коллекции, это не сработает.

Запрос:

GET [Oranization URL]/api/data/v8.0/accounts?$expand=contact_customer_accounts HTTP/1.1
Accept: application/json
Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0

И ответ:

{
"error": {
    "code": "",
    "message": "Expansion of navigation properties isn\u2019t supported on entity collections.",
    "innererror": {
        "message": "Expansion of navigation properties isn\u2019t supported on entity collections.",
        "type": "Microsoft.Crm.CrmHttpException",
        "stacktrace": "   at Microsoft.Crm.Extensibility.OData.CrmODataUtilities.ThrowIfSelectClauseHasNavigationProperty(SelectExpandClause selectExpandClause, Boolean isCalledFromEntitySet)\r\n   at Microsoft.Crm.Extensibility.OData.CrmODataServiceDataProvider.RetrieveEdmEntityCollection(CrmODataExecutionContext context, String entityCollectionName, ODataQueryOptions queryOptions)\r\n   at Microsoft.Crm.Extensibility.OData.EntityController.GetEntitySetInternal(String entitySetName, String castEntityName, CrmODataExecutionContext context, CrmEdmEntityObjectCollection crmEdmEntityObjectCollection, ODataQueryOptions queryOptions)\r\n   at Microsoft.Crm.Extensibility.OData.EntityController.GetEntitySet(String entitySetName)\r\n   at lambda_method(Closure , Object , Object[] )\r\n   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)\r\n   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"
        }
    }
}

Но если я сделаю этот запрос для одного объекта, я получу результат

[Organization URL]/api/data/v8.0/accounts(9761dd37-d1b6-e511-80d7-001dd8b71fde)?$expand=contact_customer_accounts

В предыдущих версиях CRM (2011,2015) это работало отлично. Возможно ли, чтобы MS удалила эту функцию? На самом деле, протокол oData 4.0 позволяет этот тип запросов

http://services.odata.org/v4/TripPinServiceRW/People?$expand=Trips

Почему MS запретил бы это? Новый REST API бесполезен без этого.

1 ответ

Решение

Несмотря на то, что я ожидаю, что это будет указано в Ограничениях веб-API Microsoft Dynamics CRM, оно действительно является ограничением текущей реализации.

Другие пользователи, как и вы, заметили, что, похоже, предложение $expand работает только при запросе данных одной записи.

Я создал предложение, которое было реализовано в рамках выпуска CRM весной 2016 года: Web API: внедрить $expand для коллекций:

Мы включили эту возможность весной 2016 года в выпуске Dynamics CRM. Если вы запросите развернуть и выбрать связанную коллекцию, ответ будет содержать пустую коллекцию со следующей ссылкой, которую вы затем сможете использовать для программного запроса каждой из связанных страниц. Мы активно изучаем, как мы можем поддерживать $filter в расширенной коллекции. Если ваш сценарий требует этого, пожалуйста, создайте другую идею, чтобы мы могли соответственно расставить приоритеты.

Другие вопросы по тегам