【Dynamics CRM】【Web API】Lookupフィールドの表示名取得
Dynamics CRM Web APIのQueryに関する記事です。
これから細々と投稿していきます。
意外とめんどくさい、Lookupフィールドの取得。
例えば単純に以下Lookupフィールド【primarycontactid(取引先責任者)】をSelectするリクエストを投げると、エラーが返ってきます。
【Request】
https://***.api.crm7.dynamics.com/api/data/v8.0/accounts?$select=name,primarycontactid
【Result】
{ "error": { "code": "", "message": "The navigation properties are not supported with $select clause", "innererror": { "message": "The navigation properties are not supported with $select clause", "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 ****中略**** 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()" } } }
正しいリクエストの投げ方は、Lookupフィールドの書き方を【primarycontactid】から【primarycontactid_value】というように【{FieldName}_value】に変更します。
でも、これだけですと、GUIDしか返ってきません。 【Request】 https://***.api.crm7.dynamics.com/api/data/v8.0/accounts?$select=name,_primarycontactid_value
【Result】
{ "@odata.context": "https://***.api.crm7.dynamics.com/api/data/v8.0/$metadata#accounts(name,_primarycontactid_value)", "value": [ { "@odata.etag": "W/\"712018\"", "name": "フォース コーヒー (サンプル)", "_primarycontactid_value": "91b50cdf-71a5-e511-80de-c4346bc4ef3c", "accountid": "2bb50cdf-71a5-e511-80de-c4346bc4ef3c" }, {
その問題を解決するために、
HTTPリクエストのHeaderに注釈【Prefer : odata.include-annotations="*"】を追加して、リクエストを投げます。
すると追加情報として、OData.Community.Display.V1.FormattedValueという形で表示名が取得できます。
annotationsはワイルドカードを今回指定してますが、FormattedValueだけ取得したい場合は、【Prefer : odata.include-annotations="OData.Community.Display.V1.FormattedValue"】でもかまいません。
【Request】
https://***.api.crm7.dynamics.com/api/data/v8.0/accounts?$select=name,_primarycontactid_value
Prefer : odata.include-annotations="*"
【Result】
{ "@odata.context": "https://***.api.crm7.dynamics.com/api/data/v8.0/$metadata#accounts(name,_primarycontactid_value)", "value": [ { "@odata.etag": "W/\"712018\"", "name": "フォース コーヒー (サンプル)", "_primarycontactid_value@Microsoft.Dynamics.CRM.associatednavigationproperty": "primarycontactid", "_primarycontactid_value@Microsoft.Dynamics.CRM.lookuplogicalname": "contact", "_primarycontactid_value@OData.Community.Display.V1.FormattedValue": "早川 諭 (サンプル)", "_primarycontactid_value": "91b50cdf-71a5-e511-80de-c4346bc4ef3c", "accountid": "2bb50cdf-71a5-e511-80de-c4346bc4ef3c" },