使用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"); });
错误原因
- Expand语法错误:
manager(displayName)的写法不符合Microsoft Graph的OData展开规则。要展开manager并指定返回其属性,必须使用manager($select=displayName)格式,而非直接在括号内写属性名。 - 参数冗余冲突: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
相关产品推荐
相关产品推荐

