Microsoft Graph SDK を使用してコレクションをページングする

パフォーマンス上の理由から、エンティティのコレクションは多くの場合、ページに分割され、各ページは次のページへの URL で返されます。 PageIterator クラスを使用すると、ページングされたコレクションの使用が簡単になります。 PageIterator は 、現在のページを列挙し、後続のページを自動的に要求する処理を行います。

要求ヘッダー

最初の要求で追加の要求ヘッダーを送信する場合、これらのヘッダーは既定で後続のページ要求には含まれません。 これらのヘッダーを後続のリクエストで送信する必要がある場合は、明示的に設定する必要があります。

すべてのメッセージを反復処理する

次の例は、ユーザーのメールボックス内のすべてのメッセージを反復処理する方法を示しています。

ヒント

この例では、デモンストレーションのためにパラメーターを使用して top 小さなページ サイズを設定します。 ページ サイズを最大 999 に設定して、必要な要求の数を最小限に抑えることができます。

var messages = await graphClient.Me.Messages
    .Request()
    .Header("Prefer", "outlook.body-content-type=\"text\"")
    .Select(e => new {
        e.Sender,
        e.Subject,
        e.Body
    })
    .Top(10)
    .GetAsync();

var pageIterator = PageIterator<Message>
    .CreatePageIterator(
        graphClient,
        messages,
        // Callback executed for each item in
        // the collection
        (m) =>
        {
            Console.WriteLine(m.Subject);
            return true;
        },
        // Used to configure subsequent page
        // requests
        (req) =>
        {
            // Re-add the header to subsequent requests
            req.Header("Prefer", "outlook.body-content-type=\"text\"");
            return req;
        }
    );

await pageIterator.IterateAsync();

イテレーションの停止と再開

シナリオによっては、他のアクションを実行するためにイテレーション プロセスを停止する必要があります。 イテレーションコールバックから戻ることで、イテレーションを false 一時停止できます。 PageIterator でメソッドをresume呼び出すことで、イテレーションを再開できます。

int count = 0;
int pauseAfter = 25;

var messages = await graphClient.Me.Messages
    .Request()
    .Select(e => new {
        e.Sender,
        e.Subject
    })
    .Top(10)
    .GetAsync();

var pageIterator = PageIterator<Message>
    .CreatePageIterator(
        graphClient,
        messages,
        (m) =>
        {
            Console.WriteLine(m.Subject);
            count++;
            // If we've iterated over the limit,
            // stop the iteration by returning false
            return count < pauseAfter;
        }
    );

await pageIterator.IterateAsync();

while (pageIterator.State != PagingState.Complete)
{
    Console.WriteLine("Iteration paused for 5 seconds...");
    await Task.Delay(5000);
    // Reset count
    count = 0;
    await pageIterator.ResumeAsync();
}