Microsoft Graph Sdk を使用したコレクションのページPage through a collection using the Microsoft Graph SDKs

パフォーマンス上の理由から、多くの場合、エンティティのコレクションはページに分割され、各ページは次のページへの URL で返されます。For performance reasons, collections of entities are often split into pages and each page is returned with a URL to the next page. Pageiteratorクラスは、ページングされたコレクションの使用を簡素化します。The PageIterator class simplifies consuming of paged collections. Pageiterator は現在のページを列挙し、後続のページを自動的に要求します。PageIterator handles enumerating the current page and requesting subsequent pages automatically.

すべてのメッセージを反復処理するIterate over all the messages

次の例は、ユーザーのメールボックス内のすべてのメッセージの反復処理を示しています。The following example shows iterating over all the messages in a user's mailbox.

ヒント

この例では、デモンストレーション目的でパラメーターを使用して小さいページサイズを設定 top します。This example sets a small page size using the top parameter for demonstration purposes. 必要な要求の数を最小限に抑えるには、ページサイズを最大999に設定します。You can set the page size up to 999 to minimize the number of requests that are necessary.

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);
        return true;
    });

await pageIterator.IterateAsync();

イテレーションの停止と再開Stopping and resuming the iteration

一部のシナリオでは、他のアクションを実行するために反復処理を停止する必要があります。Some scenarios require stopping the iteration process in order to perform other actions. イテレーションのコールバックから戻ることで、反復を一時停止することができ false ます。It is possible to pause the iteration by returning false from the iteration callback. 反復処理は resumepageiteratorのメソッドを呼び出すことで再開できます。Iteration can be resumed by calling the resume method on the PageIterator.

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...");
    Thread.Sleep(5000);
    // Reset count
    count = 0;
    await pageIterator.ResumeAsync();
}