如何在Microsoft Graph API Beta中使用OdataNextLink实现分页
Graph API Beta版分页替代方案(原NextPageRequest失效)
从Microsoft Graph API v1.0升级到Beta版以支持CustomSecurityAttributeValue后,原分页逻辑依赖的NextPageRequest属性已被移除,仅能获取字符串类型的OdataNextLink,需要通过该链接手动发起下一页请求。
以下是修改后的完整代码,实现基于OdataNextLink的分页处理:
public async Task<IEnumerable<Microsoft.Graph.Beta.Models.User>> GetGraphUsersInGroups(IEnumerable<string> groupIds, string? searchText = null) { Dictionary<String, Microsoft.Graph.Beta.Models.User> users = new Dictionary<String, Microsoft.Graph.Beta.Models.User>(); foreach (var groupId in groupIds) { try { var membersPage = await GraphClient.Groups[groupId].Members .GetAsync((memberRequest) => { memberRequest.Headers.Add(new KeyValuePair<string, string>("$count", "true")); memberRequest.Headers.Add(new KeyValuePair<string, string>("ConsistencyLevel", "eventual")); memberRequest.QueryParameters.Count = true; memberRequest.QueryParameters.Orderby = new[] { "displayName" }; if (searchText != null) memberRequest.QueryParameters.Search = $"\"displayName:{searchText}\""; }); while (membersPage != null) { foreach (var member in membersPage.Value.OfType<Microsoft.Graph.Beta.Models.User>()) { users[member.Id] = member; } if (membersPage.OdataNextLink != null) { // 基于OdataNextLink创建下一页请求,保留必要请求头 var nextPageRequest = GraphClient.Request() .WithUrl(membersPage.OdataNextLink) .Header("ConsistencyLevel", "eventual") .Header("$count", "true"); membersPage = await nextPageRequest.GetAsync<Microsoft.Graph.Beta.Models.UserCollectionResponse>(); } else break; } } catch(Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); } } return users.Values; }
关键说明
- 通过
GraphClient.Request().WithUrl(membersPage.OdataNextLink)直接基于分页链接构建请求 - 手动添加原请求中的
ConsistencyLevel和$count请求头,确保搜索、计数等功能的一致性 - 使用
GetAsync<UserCollectionResponse>解析下一页结果,替换原集合对象继续循环分页
内容的提问来源于stack exchange,提问作者Twisted89
相关产品推荐
相关产品推荐

