You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MS Graph C# SDK v5中Groups分页实现问题求助

MS Graph SDK v5 实现 Groups 分页的解决方案

1. 修复 PageIterator 的异步回调错误

你的代码报错是因为 SDK v5 中 PageIterator 的 item 处理回调要求返回 Task<bool> 而非同步的 bool,同时泛型参数需匹配正确的集合类型(你之前误用了 UserCollectionResponse,应对应 GroupCollectionResponse)。

修正后的代码示例:

// 初始化请求配置
var requestConfig = new GroupsRequestBuilder.GroupsRequestBuilderGetRequestConfiguration();
requestConfig.QueryParameters.Select = new[] { "displayName" };
requestConfig.QueryParameters.Expand = new[] { "members($select=id,displayName)" };

// 获取第一页数据
var firstPage = await graphClient.Groups.GetAsync(requestConfig);

int count = 0;
const int MaxRecordWanted = 100;

// 正确创建 PageIterator,泛型参数为 <Group, GroupCollectionResponse>
var pageIterator = PageIterator<Group, GroupCollectionResponse>
    .CreatePageIterator(
        graphClient,
        firstPage,
        // 使用异步回调,返回 Task<bool>
        async (group) =>
        {
            count++;
            Console.WriteLine($"Group: {group.DisplayName} ({group.Id})");
            foreach (var member in group.Members)
            {
                Console.WriteLine($"Member: {member.DisplayName} ({member.Id})");
            }

            // 达到指定数量后停止迭代,返回 false;否则继续返回 true
            return count < MaxRecordWanted;
        }
    );

// 执行异步迭代
await pageIterator.IterateAsync();

SDK v5 中无法通过原有请求配置直接传入 NextLink,需使用 RequestAdapter 直接发送请求到 NextLink 地址并反序列化结果:

// 获取第一页数据
var firstPage = await graphClient.Groups.GetAsync();

if (!string.IsNullOrEmpty(firstPage.OdataNextLink))
{
    // 使用 RequestAdapter 发送请求到 NextLink
    var nextPage = await graphClient.RequestAdapter.SendAsync<GroupCollectionResponse>(
        new Uri(firstPage.OdataNextLink),
        Microsoft.Kiota.Abstractions.RequestInformation.CreateGetRequestInformation()
    );

    // 处理下一页数据
    foreach (var group in nextPage.Value)
    {
        Console.WriteLine(group.DisplayName);
    }
}

3. 关于直接获取指定页面(如第8页)的说明

MS Graph API 的 Groups 端点不支持 $skip 参数,因此无法直接跳转到指定页码。若需定位到某一页,只能通过以下两种方式:

  • 逐页调用 OdataNextLink 遍历到目标页;
  • 如果有可排序的唯一标识(如 id 或 displayName),可结合 $top 和 $filter 实现类似分页效果,但无法精准对应“第8页”的概念(数据可能在遍历过程中发生变化)。

修复批量收集页面的代码

你原有的代码试图收集所有 GroupCollectionResponse 页,需使用 PageIterator 的 PageVisited 回调捕获每一页数据:

var outputPages = new List<GroupCollectionResponse>();
var firstPage = await graphClient.Groups.GetAsync();

var pageIterator = PageIterator<Group, GroupCollectionResponse>
    .CreatePageIterator(
        graphClient,
        firstPage,
        // 处理单个 Group 项,返回 true 继续迭代
        async (group) =>
        {
            // 可在此处理单个 Group
            return true;
        },
        // PageVisited 回调:每次获取新页时触发
        (page) =>
        {
            outputPages.Add(page);
            return Task.CompletedTask;
        }
    );

await pageIterator.IterateAsync();

// outputPages 包含所有分页的 GroupCollectionResponse

内容的提问来源于stack exchange,提问作者Jeff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 18:32:54