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

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

または、 プロパティを使用して、後続の@odata.nextLinkページを手動で要求することもできます。

要求ヘッダー

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

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

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

ヒント

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

var messages = await graphClient.Me.Messages
    .GetAsync(requestConfiguration =>
    {
        requestConfiguration.QueryParameters.Top = 10;
        requestConfiguration.QueryParameters.Select =
            ["sender", "subject", "body"];
        requestConfiguration.Headers.Add(
            "Prefer", "outlook.body-content-type=\"text\"");
    });

if (messages == null)
{
    return;
}

var pageIterator = PageIterator<Message, MessageCollectionResponse>
    .CreatePageIterator(
        graphClient,
        messages,
        // Callback executed for each item in
        // the collection
        (msg) =>
        {
            Console.WriteLine(msg.Subject);
            return true;
        },
        // Used to configure subsequent page
        // requests
        (req) =>
        {
            // Re-add the header to subsequent requests
            req.Headers.Add("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
    .GetAsync(requestConfiguration =>
    {
        requestConfiguration.QueryParameters.Top = 10;
        requestConfiguration.QueryParameters.Select =
            ["sender", "subject"];
    });

if (messages == null)
{
    return;
}

var pageIterator = PageIterator<Message, MessageCollectionResponse>
    .CreatePageIterator(
        graphClient,
        messages,
        (msg) =>
        {
            Console.WriteLine(msg.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();
}

後続のページを手動で要求する

PageIterator クラスを使用する代わりに、プロパティの応答@odata.nextLinkを手動でチェックし、次のページを要求できます。

var messages = await graphClient.Me.Messages
    .GetAsync(requestConfiguration =>
    {
        requestConfiguration.QueryParameters.Top = 10;
    });

while (messages?.Value != null)
{
    foreach (var message in messages.Value)
    {
        Console.WriteLine(message.Subject);
    }

    // If OdataNextLink has a value, there is another page
    if (!string.IsNullOrEmpty(messages.OdataNextLink))
    {
        // Pass the OdataNextLink to the WithUrl method
        // to request the next page
        messages = await graphClient.Me.Messages
            .WithUrl(messages.OdataNextLink)
            .GetAsync();
    }
    else
    {
        // No more results, exit loop
        break;
    }
}