Dynamics CRM 2016 SDK 新機能: Web API その 7: 複数レコード取得時のページング

みなさん、こんにちは。

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

今回は複数レコードを取得する際のページングについて紹介します。

概要

Web API を利用した複数レコードの取得では、既定で最大 5000 件の
レコードが取得可能です。一度に取得する件数をより少なくすることも、
ページングを使って 5000 件以上のデータも取得が可能です。

取得するレコード数の設定

まずは 5000 件より少ない件数を取得したい場合について説明します。

プログラムの実装

1. 前回利用した Visual Studio ソリューションを開き、Program.cs
ファイルを開きます。新しく以下のメソッドを追加します。

public async Task RunPaging(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);

    }
}

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

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

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

3. 新しく追加した RunPaging メソッド内に以下のコードを追加
して、ページサイズを 10 とします。

// MaxPageSize を 10 に設定
httpClient.DefaultRequestHeaders.Add("Prefer", "odata.maxpagesize=10");

4. 以下のコードを追加して、取引先企業を取得し、件数を表示します。

// 取引先企業番号が存在する取引先企業の取得
HttpResponseMessage accountsRes = await httpClient.GetAsync(serviceUrl + "accounts?$select=name");
JToken accounts = JObject.Parse(accountsRes.Content.ReadAsStringAsync().Result)["value"];

// 件数の表示
Console.WriteLine("レコードの件数:{0} 件", accounts.Count());

動作確認

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

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

image

3. 指定したページングサイズ以下の件数が取得できることを
確認します。

image

ページングの利用

次にページングを利用して残りのレコードを取得します。次のページの
データのアクセスするためのアドレスは、応答より取得が可能です。

プログラムの実装

1. 先ほどのコードに続いて、以下のコードを追加して、先ほど取得した
レコードを表示します。

// レコードの表示
foreach (JToken account in accounts)
{
    Console.WriteLine("取引先企業名: {0}", account["name"]);
}

2. 以下のコードを追加して、次のページのアドレスを取得します。
応答の @odata.nextLink にアドレスが格納されています。

// 次のページリンクを取得
var nextLink = JObject.Parse(accountsRes.Content.ReadAsStringAsync().Result)["@odata.nextLink"];

3. 以下のコードを追加してレコードを取得します。

// 次の 10 件の取得
HttpResponseMessage nextAccountsRes = await httpClient.GetAsync(nextLink.ToString());
JToken nextAccounts = JObject.Parse(nextAccountsRes.Content.ReadAsStringAsync().Result)["value"];

4. 以下のコードを追加 レコードの名前を画面に表示します。

// レコードの表示
foreach (JToken account in nextAccounts)
{
    Console.WriteLine("取引先企業名: {0}", account["name"]);
}

動作確認

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

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

3. 合計で 20 件のレコードが表示されることを確認します。

image

まとめ

うまくページングの機能を利用して、パフォーマンスの調整や
処理すべきレコードをすべて取得できます。是非お試しください!

- 中村 憲一郎

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