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

使用Microsoft Graph 5.24获取含经理信息的用户列表时抛出ODataError

问题分析与解决方案

问题描述

在.NET Core 6中使用Microsoft Graph 5.24版本批量获取用户及其经理姓名,希望避免循环发起单独请求获取经理信息。现有代码抛出Microsoft.Graph.Models.ODataErrors.ODataError错误,不想采用逐个遍历用户请求经理的方案。

原错误代码:

List<UserProfile> list = new List<UserProfile>(); 
var clientSecretCredential = new ClientSecretCredential(
  tenantId, clientId, clientSecret);
var tokenRequestContext = new TokenRequestContext(scopes);
TokenCredential tokenCredential = clientSecretCredential;
GraphServiceClient graphServiceClient = new GraphServiceClient(tokenCredential, scopes, baseUrl);
var result = await graphServiceClient.Users.GetAsync((requestConfiguration) =>
{
    requestConfiguration.QueryParameters.Expand = new string[] { "manager(displayName)" };
    requestConfiguration.QueryParameters.Search = $"\"mail:{useremail}\" OR \"onPremisesSamAccountName:{useremail}\" OR \"displayname:{useremail}\" OR \"employeeId:{useremail}\"";
    requestConfiguration.QueryParameters.Orderby = new string[] { "displayName" };
    requestConfiguration.QueryParameters.Count = true;
    requestConfiguration.QueryParameters.Select = new string[] { "displayName", "employeeId", "onPremisesSamAccountName", "mail","manager" };
    requestConfiguration.Headers.Add("ConsistencyLevel", "eventual");
});

错误原因

  1. Expand语法错误:manager(displayName)的写法不符合Microsoft Graph的OData展开规则。要展开manager并指定返回其属性,必须使用manager($select=displayName)格式,而非直接在括号内写属性名。
  2. 参数冗余冲突:Select参数中包含manager,同时又通过Expand展开manager,结合错误的Expand语法会导致Graph API无法正确解析请求,最终抛出ODataError。

修正后的代码

List<UserProfile> list = new List<UserProfile>(); 
var clientSecretCredential = new ClientSecretCredential(tenantId, clientId, clientSecret);
GraphServiceClient graphServiceClient = new GraphServiceClient(clientSecretCredential, scopes, baseUrl);

var result = await graphServiceClient.Users.GetAsync(requestConfiguration =>
{
    // 修正Expand语法,展开manager并指定返回displayName属性
    requestConfiguration.QueryParameters.Expand = new string[] { "manager($select=displayName)" };
    requestConfiguration.QueryParameters.Search = $"\"mail:{useremail}\" OR \"onPremisesSamAccountName:{useremail}\" OR \"displayname:{useremail}\" OR \"employeeId:{useremail}\"";
    requestConfiguration.QueryParameters.Orderby = new string[] { "displayName" };
    requestConfiguration.QueryParameters.Count = true;
    // 移除Select中的manager,已通过Expand指定返回的经理属性
    requestConfiguration.QueryParameters.Select = new string[] { "displayName", "employeeId", "onPremisesSamAccountName", "mail" };
    requestConfiguration.Headers.Add("ConsistencyLevel", "eventual");
});

// 批量提取用户及经理信息
foreach (var user in result.Value)
{
    var managerDisplayName = user.Manager?.AdditionalData["displayName"]?.ToString();
    list.Add(new UserProfile
    {
        DisplayName = user.DisplayName,
        EmployeeId = user.EmployeeId,
        SamAccountName = user.OnPremisesSamAccountName,
        Mail = user.Mail,
        ManagerName = managerDisplayName
    });
}

关键说明

  • 修正后的Expand语法会让Graph API在返回用户数据时,一并返回对应经理的displayName属性,无需单独发起请求。
  • Microsoft Graph SDK 5.x中,展开的嵌套属性不会直接映射到user.Manager的强类型属性,需要通过AdditionalData字典获取指定属性值。
  • ConsistencyLevel: eventual请求头必须保留,因为使用了Search和Count参数,这是API要求的一致性配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:11:04