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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:27:47