Morning Girl

Web API, Windows, C#, .NET, Dynamics 365/CRM etc..

【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"
        },