Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 874
zskovacs Avatar asked Jan 12 '16 11:01

zskovacs


People also ask

Is OData deprecated?

It was deprecated with Dynamics 365 Customer Engagement v8. 0. Also known as the OData endpoint or REST endpoint when it was released, this endpoint only provides the ability to perform create, retrieve, update, and delete operations on tables.

How can you retrieve more than 5000 records in Dynamics CRM using query expression?

QueryExpression or FetchXML is one of the most common ways to retrieve data from Dynamics 365 in C# and it's so convenient, isn't it? But if there are more than 5,000 records, which is the case in quite a few organizations, we will be bound to use Paging on the top of a simple QueryExpression or FetchXML.

Which data entity can be exposed to OData?

OData services. We provide an OData REST endpoint. This endpoint exposes all the data entities that are marked as IsPublic in the Application Object Tree (AOT). It supports complete CRUD (create, retrieve, update, and delete) functionality that users can use to insert and retrieve data from the system.

What are some of the benefits of using the OData v4 protocol?

Here are few advantages of OData. OData is a open protocol started by Microsoft is based on Rest Services so we can get data base on URL. It suppport various protocol like http,atom,pub and also support JSON format. No need to create proxy classes which we used to do it in web service.


1 Answers

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.

like image 74
Henrik H Avatar answered Sep 28 '22 06:09

Henrik H