【Dynamics CRM】【Web API】FetchXMLを利用したレコードの取得
Dynamics CRMではFetchXMLというクエリ用XMLが内部で利用されています。
https://msdn.microsoft.com/ja-jp/library/gg328332.aspx
これを用いて、データ取得のリクエストが投げられます。
メリットとしては、通常のSelectではJoinできない、1:N、N:1のJoin等が利用できる点にあるでしょう。
気をつけたい点として、HTTP Requestの文字数制限があるかと思います。
取得先フィールドがあまり多くないのであれば、attribue allなどを指定してあげれば、少しは省略できる感じでしょうか。
(その分Resultの量は増えますが)
【Request】
GET https://***.api.crm7.dynamics.com/api/data/v8.0/accounts?fetchXml=<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'><entity name='account'><attribute name='name' ></attribute><attribute name='address1_city' ></attribute><attribute name='primarycontactid' ></attribute><attribute name='telephone1' ></attribute><attribute name='accountid' ></attribute><order attribute='name' descending='false' ></order><filter type='and'><condition attribute='statecode' operator='eq' value='0' ></condition></filter><link-entity name='contact' from='contactid' to='primarycontactid' visible='false' link-type='outer' alias='accountprimarycontactidcontactcontactid'><attribute name='emailaddress1' ></attribute></link-entity></entity></fetch>
【Result】
{ "@odata.context": "https://***.api.crm7.dynamics.com/api/data/v8.0/$metadata#accounts(name,_primarycontactid_value,accountid)", "value": [ { "@odata.etag": "W/\"712017\"", "name": "test", "_primarycontactid_value": "049b0510-9cc0-e511-80de-c4346bc4ecf4", "accountid": "2b102e4d-7ca8-e511-80dd-c4346bc51088" }, { "@odata.etag": "W/\"558908\"", "name": "アドベンチャー ワークス (サンプル)", "_primarycontactid_value": null, "accountid": "2fb50cdf-71a5-e511-80de-c4346bc4ef3c", "address1_city": "世田谷区", "telephone1": "03-2232-019x", "address1_composite": "世田谷区" },
ちなみにFetchXMLは集計にも対応しているので、以下の様なRequestも可能です。
https://msdn.microsoft.com/ja-jp/library/gg309565.aspx
【Request】
GET https://***.api.crm7.dynamics.com/api/data/v8.0/accounts?fetchXml=<fetch version='1.0' output-format='xml-platform' mapping='logical' aggregate='true'><entity name='account'> <attribute name='name' aggregate='count' alias='countResult'></attribute></entity></fetch>
【Result】
{ "@odata.context": "https://***.api.crm7.dynamics.com/api/data/v8.0/$metadata#accounts", "value": [ { "countResult": 10 } ] }