C#调用Microsoft Graph如何仅获取Group类型AAD组成员
C#调用Microsoft Graph仅返回组成员的实现方案
接口支持情况
可以直接通过Graph原生能力让接口仅返回microsoft.graph.group类型的成员,无需客户端逐对象校验类型。
你之前尝试的在成员路径后追加/microsoft.graph.group的写法是官方支持的类型筛选语法,适用于直接成员、传递成员查询场景:
- 查询直接成员中的组:
/groups/{group-id}/members/microsoft.graph.group - 查询传递嵌套成员中的组:
/groups/{group-id}/transitivemembers/microsoft.graph.group
对应你当前使用的Microsoft Graph .NET SDK(v4版本,带Request()写法的版本),不需要手动拼接HTTP请求,直接用SDK内置的OfType<T>()方法即可实现同等效果,代码示例:
// 仅查询传递成员中的组类型对象,若要查直接成员把TransitiveMembers替换为Members即可 var groupMembers = graphClient.Groups[objectId.ToString()] .TransitiveMembers .OfType<Microsoft.Graph.Group>() // 对应服务端类型过滤,返回结果直接为Group类型集合 .Request() // 如果只需要组ID等少量字段,可追加Select进一步裁剪响应内容,例:.Select(g => new {g.Id, g.DisplayName}) .GetAsync() .ConfigureAwait(false) .GetAwaiter() .GetResult(); // 分页逻辑和原有写法一致,不需要再做类型判断 do { foreach (var group in groupMembers.CurrentPage) { // 这里的group直接是Microsoft.Graph.Group类型,无需is判断、类型转换 groups.Add(Guid.Parse(group.Id)); } } while (groupMembers.NextPageRequest != null && (groupMembers = groupMembers.NextPageRequest.GetAsync().ConfigureAwait(false).GetAwaiter().GetResult()).Count > 0);
请求成本对比
拉取全部成员再客户端筛选、和直接调用类型过滤接口的请求成本不一致,后者成本更低,差异主要在三个维度:
- 服务端处理开销:类型过滤在服务端执行,遍历目录成员时会直接跳过用户、服务主体、设备等非组对象,不会对非目标对象做序列化处理,服务端资源占用更低。
- 网络传输开销:类型过滤后的响应体仅包含组对象的字段,没有其他类型成员的冗余数据,响应体积更小,对应分页数量更少,网络传输耗时更短。
- 请求配额消耗:Graph接口配额按单请求计数,若返回结果分页数量一致,两种调用的配额消耗相同;但过滤后单页可承载更多目标对象,总分页数通常更少,整体配额消耗更低。
注意:如果你只需要组ID、显示名等少量属性,建议追加
Select()指定返回字段,可进一步降低响应体积、提升请求速度。
内容的提问来源于stack exchange,提问作者user989988
相关产品推荐
相关产品推荐

