Dynamics CRM 2016 SDK 新機能: Web API その 3: FetchXML を利用したレコードの取得

みなさん、こんにちは。

前回に引き続き、Dynamics CRM 2016 SDK の新機能として、正式版と
なった Web API について紹介します。

今回は FetchXML を利用したレコードの取得を紹介します。

概要

FetchXML を利用したレコードの取得は以下の流れとなります。

1. FetchXML を定義します。
2. 定義した FetchXML を利用してレコードの一覧を取得します。

では早速実装していきましょう。

FetchXML の作成

今回は高度な検索を利用して FetchXML を作ります。

1. ブラウザで Dynamics CRM 組織に接続して、高度な検索を開きます。

2. 任意の条件作成します。ここでは「自分のアクティブな取引先企業」
ビューの定義をそのまま再利用しました。

3. 「FetchXML のダウンロード」をクリックします。

image

4. ファイルを任意の場所に保存します。

プログラムの実装

1. 前回利用した Visual Studio ソリューションを開きます。

2. FetchXML を UrlEncode するために System.Web.HttpUtility を使うため、
参照を右クリックして「参照の追加」をクリックします。

image

3. アセンブリ | フレームワークより 「System.Web」を選択して「OK」を
クリックします。

image

4. Program.cs ファイルを開きます。新しく以下のメソッドを追加します。

public async Task RunFetchXMLQuery(string accessToken)
{
    // HttpClient の作成
    using (HttpClient httpClient = new HttpClient())
    {
        // Web API アドレスの作成
        string serviceUrl = serverUrl + "/api/data/v8.0/";
        // ヘッダーの設定
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

    }
}

5. Main メソッドの以下のコードを書き換えて、新しいメソッドを
呼ぶように変更します。

元)  
Task.WaitAll(Task.Run(async () => await app.RunFetchXMLQuery(result.AccessToken)));

変更後)
Task.WaitAll(Task.Run(async () => await app.RunViewQueries(result.AccessToken)));

6. 先ほど保存した FetchXML をメモ帳で開き、ダブルクォーテーションを
シングルクォーテーションに変換します。

7. 以下のコードを追加して FetchXML を UrlEncode します。

string fetch = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
  <entity name='account'>
    <attribute name='name' />
    <attribute name='address1_city' />
    <attribute name='primarycontactid' />
    <attribute name='telephone1' />
    <attribute name='accountid' />
    <order attribute='name' descending='false' />
    <filter type='and'>
      <condition attribute='ownerid' operator='eq-userid' />
      <condition attribute='statecode' operator='eq' value='0' />
    </filter>
    <link-entity name='contact' from='contactid' to='primarycontactid' visible='false' link-type='outer' alias='accountprimarycontactidcontactcontactid'>
      <attribute name='emailaddress1' />
    </link-entity>
  </entity>
</fetch>";

string encodedFetch = System.Web.HttpUtility.UrlEncode(fetch);

8. 以下のコードを追加します。

HttpResponseMessage retrieveRes = await httpClient.GetAsync(serviceUrl + "accounts?fetchXml=" + encodedFetch);
JToken accounts = JObject.Parse(retrieveRes.Content.ReadAsStringAsync().Result)["value"];

foreach (JToken account in accounts)
{
    Console.WriteLine("取引先企業名: {0}", account["name"]);
}

動作確認

1. F5 キーを押下してプログラムを実行します。

2. 認証ダイアログが表示されたらログインします。

3. FetchXML で定義したクエリに対応する取引先企業一覧が表示される
ことを確認します。

image

以下に今回追加したメソッドを示します。

public async Task RunFetchXMLQuery(string accessToken)
{
    // HttpClient の作成
    using (HttpClient httpClient = new HttpClient())
    {
        // Web API アドレスの作成
        string serviceUrl = serverUrl + "/api/data/v8.0/";
        // ヘッダーの設定
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

        string fetch = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
<entity name='account'>
<attribute name='name' />
<attribute name='address1_city' />
<attribute name='primarycontactid' />
<attribute name='telephone1' />
<attribute name='accountid' />
<order attribute='name' descending='false' />
<filter type='and'>
<condition attribute='ownerid' operator='eq-userid' />
<condition attribute='statecode' operator='eq' value='0' />
</filter>
<link-entity name='contact' from='contactid' to='primarycontactid' visible='false' link-type='outer' alias='accountprimarycontactidcontactcontactid'>
<attribute name='emailaddress1' />
</link-entity>
</entity>
</fetch>";
        string encodedFetch = System.Web.HttpUtility.UrlEncode(fetch);

        // FetchXML の実行
        HttpResponseMessage retrieveRes = await httpClient.GetAsync(serviceUrl + "accounts?fetchXml=" + encodedFetch);
        JToken accounts = JObject.Parse(retrieveRes.Content.ReadAsStringAsync().Result)["value"];

        foreach (JToken account in accounts)
        {
            Console.WriteLine("取引先企業名: {0}", account["name"]);
        }
    }
}

まとめ

実際のシナリオでは定義した FetchXML の条件などをコード内で動的に
変えて実行する場合が多いと思います。是非前回紹介したビューの取得と
組み合わせて利用してみてください。

- 中村 憲一郎

※本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります