Search code examples
odatacrmdynamics-crm-onlinedynamics-crm-2016dynamics-crm-webapi

CRM 2016 oData expand on collection


I'm trying to retrieve multiple data from the new REST API but I have a strange issue. If I use $expand on a collection then it doesn't work.

The request is:

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

And the response:

{
"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()"
        }
    }
}

But if I make this request on a single entity then I get the result

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

In the previous versions of CRM (2011,2015) this was worked perfectly. Is it possible that MS remove this function? Actually, the oData 4.0 protocol allows this type of queries

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

Why would MS disallow it? The new REST API is useless without this.


Solution

  • Even though I would expect this to be listed in Microsoft Dynamics CRM Web API Limitations it does indeed appear to be a limitation of the current implementation.

    Other users have noticed, like you, that it appears that the $expand clause only works when requesting data of a single record.

    I have created a suggestion, which was implemented as part of the Spring 2016 release of CRM: Web API: Implement $expand on collections:

    We enabled this capability in Spring 2016 release of Dynamics CRM. If you request an expand & select on a related collection the response will contain an empty collection with a nextlink which you can then use to programmatically request each of the related pages. We are actively looking into how we can support $filter on the expanded collection. If your scenario requires that then please create another idea so that it we can prioritize it accordingly.