More REST queries with CRM 2011

Prompted by a question on a previous post, I’ve posted some additional examples on the CRM 2011 REST interface. In particular, this post covers the ability to query relationships and complex types.  All the examples below and more are explained in the CRM 2011 SDK.

From an <entity>Set query, there are a number of <link …>  elements that describe the URL’s to access information from the current entity relationships. For example:

To list a specific Account, request

xrmservices/2011/organizationdata.svc/AccountSet(guid’b9436b0d-b832-e011-9e40-00155da9cd4f’)

If you then search in the response content for “contact_customer_accounts”, you will find an entry like

<link rel=”http://schemas.microsoft.com/ado/2007/08/dataservices/related/contact_customer_accounts” type=”application/atom+xml;type=feed” title=”contact_customer_accounts” href=”AccountSet(guid’b9436b0d-b832-e011-9e40-00155da9cd4f’)/contact_customer_accounts” />

The href attribute presents a URL to retrieve the results from the contact_customer_accounts relationship which describes the 1:N between Account and Contact.  So, if we execute that request, we receive all Contacts under that account.

Likewise, from a specific Contact

xrmservices/2011/organizationdata.svc/ContactSet(guid’f0491131-7925-e011-9e40-00155da9cd4f’)

The linked Account can be found using the same relationship name

xrmservices/2011/organizationdata.svc/ContactSet(guid’f0491131-7925-e011-9e40-00155da9cd4f’)/contact_customer_accounts/

Furthermore, you can also add filters to these requests in the usual way, so looking for the Contact ‘Fred Bloggs’ under known Account

xrmservices/2011/organizationdata.svc/AccountSet(guid’b9436b0d-b832-e011-9e40-00155da9cd4f’)/contact_customer_accounts?$filter=FullName eq ‘Fred Bloggs’

When I said it’s not always intuitive, it would be nice to be able to filter the entity attributes directly such as

xrmservices/2011/organizationdata.svc/ContactSet?$filter=ParentCustomerId eq ‘b9436b0d-b832-e011-9e40-00155da9cd4f’

and you’re left with a CRM error

Operator ‘eq’ incompatible with operand types ‘Microsoft.Crm.Metadata.ComplexTypeInstance`1[[Microsoft.Xrm.Sdk.EntityReference, Microsoft.Xrm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]’ and ‘System.String’ at position 17

But theres a solution! Complex Types can be handled by specifying the attribute in the LHS of the filter expression such as

xrmservices/2011/organizationdata.svc/ContactSet?$filter=ParentCustomerId/Id eq ‘b9436b0d-b832-e011-9e40-00155da9cd4f’

Here’s some more examples based on the Account->Contact->Address relationships. You can view it in a spreadsheet here.