如何使用$top和$skip参数获取用户及分页查询场所数据?
关于Microsoft Graph API中$top和$skip参数的使用问题
1. 如何使用$top和$skip参数获取用户数据
$top用于指定单次请求返回的最大条目数量(多数端点最大支持999,部分端点有特殊限制),$skip用于指定跳过的条目数量,两者结合可实现分页获取全量数据。
示例请求
获取前50条用户数据:
GET https://graph.microsoft.com/v1.0/users?$top=50
跳过前50条,获取接下来的50条用户数据:
GET https://graph.microsoft.com/v1.0/users?$top=50&$skip=50
C#代码示例
async Task<List<User>> GetAllUsersAsync() { var allUsers = new List<User>(); int top = 50; int skip = 0; int totalCount; // 首次请求获取总数与第一批数据 var firstResponse = await graphClient.Users .Request() .Top(top) .Skip(skip) .GetAsync(); allUsers.AddRange(firstResponse.CurrentPage); totalCount = firstResponse.AdditionalData.TryGetValue("@odata.count", out object count) ? (int)count : allUsers.Count; // 计算剩余请求次数 int remainingCount = totalCount - allUsers.Count; int numberOfRequests = (int)Math.Ceiling(remainingCount / (double)top); for (int i = 0; i < numberOfRequests; i++) { skip += top; var nextResponse = await graphClient.Users .Request() .Top(top) .Skip(skip) .GetAsync(); allUsers.AddRange(nextResponse.CurrentPage); } return allUsers; }
2. 调用房间接口时无@odata.nextLink,能否用$top和$skip获取剩余结果
可以。部分Microsoft Graph API端点(如places/microsoft.graph.room)返回数据时可能不会提供@odata.nextLink,但只要端点支持$top和$skip参数,且已通过$count=true获取总条目数,就可以通过计算总页数,循环使用$top和$skip分批获取全量数据。
修正后的C#代码示例
原代码存在整数除法误差、变量重复定义的问题,修正后如下:
var top = 100; var skip = 0; var allPlaces = new List<Room>(); // 存储所有房间数据 // 首次请求获取总数与第一批数据 var initialResponse = await GetPlacesAsync(url, top, skip); allPlaces.AddRange(initialResponse.CurrentPage); var total = initialResponse.AdditionalData.TryGetValue("@odata.count", out object count) ? (int)count : allPlaces.Count; if (total > 0) { // 计算剩余条目数,转double避免整数除法截断 var remainingItems = total - allPlaces.Count; var numberOfRequests = (int)Math.Ceiling(remainingItems / (double)top); for (int i = 0; i < numberOfRequests; i++) { skip += top; var nextResponse = await GetPlacesAsync(url, top, skip); allPlaces.AddRange(nextResponse.CurrentPage); } }
注意事项
- 确保
GetPlacesAsync方法能正确拼接参数到请求URL,比如生成https://graph.microsoft.com/v1.0/places/microsoft.graph.room?$count=true&$top=100&$skip=100这类地址。 - 不同端点对$top的最大值限制不同,需根据实际情况调整
top变量值。
内容的提问来源于stack exchange,提问作者user989988
相关产品推荐
相关产品推荐

