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

如何使用$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 04:05:14