使用.NET Microsoft.Graph库Expand查询全量组及成员仅返回100条问题咨询
结论
不存在可以单次查询获取所有269个组及其全部成员信息的方案,这是Microsoft Graph服务端的硬限制导致的,和代码逻辑无关。
限制说明
- 当查询携带
$expand参数展开集合类型字段(比如此处的members)时,主资源(组)集合的单次返回上限固定为100条,即使显式设置Top(999)也会被服务端自动忽略,所以你会遇到仅返回100条组数据的情况。 - 除此之外,单个组通过
$expand展开的members也有20条的返回上限,如果某个组成员数超过20,单次展开也只能拿到前20条成员,剩余成员需要单独分页查询。
优化方案
你现有的分页拉取组的逻辑是正确的,可以拿到全部269个组,若需要获取每个组的完整成员信息,推荐三种实现方式:
- 方式一:分页拉取所有组后,遍历每个组单独请求成员列表,代码示例如下:
// 先按现有逻辑拉取所有组 var groupsPage = await graphServiceClient.Groups .Request() .Expand("members") .GetAsync(); List<Microsoft.Graph.Group> allGroups = new List<Microsoft.Graph.Group>(); while (groupsPage.Count > 0) { allGroups.AddRange(groupsPage.CurrentPage); if (groupsPage.NextPageRequest == null) break; groupsPage = await groupsPage.NextPageRequest.GetAsync(); } // 遍历每个组拉取完整成员 foreach (var group in allGroups) { var membersPage = await graphServiceClient.Groups[group.Id].Members .Request() .Top(999) .GetAsync(); List<Microsoft.Graph.DirectoryObject> allMembers = new List<Microsoft.Graph.DirectoryObject>(); while (membersPage.Count > 0) { allMembers.AddRange(membersPage.CurrentPage); if (membersPage.NextPageRequest == null) break; membersPage = await membersPage.NextPageRequest.GetAsync(); } // 处理当前组的全量成员 group.Members = allMembers; }
- 方式二:如果需要处理嵌套组的全量成员,无需自己递归遍历,可以直接请求组的
transitiveMembers获取所有层级的成员,将上面的成员请求路径替换为graphServiceClient.Groups[group.Id].TransitiveMembers.Request()即可。 - 方式三:组数量较多时可以使用
$batch批量请求能力,将多个成员查询合并为单次请求发送,减少网络开销,提升同步效率。
内容的提问来源于stack exchange,提问作者Emaborsa
相关产品推荐
相关产品推荐

