使用.NET Graph SDK获取SharePoint Online列表项数量遇异常咨询
你遇到的报错是因为/sites/{siteId}/lists/{listId}/items端点确实不支持$count查询参数,直接添加count=true会触发invalidRequest异常,但获取列表项数量的操作完全可以实现,分两种场景处理:
场景1:获取列表所有项的总数量(无筛选条件)
直接请求列表对象的itemCount属性即可,这个属性是SharePoint维护的内置统计值,不需要遍历所有项,性能最优。
修改后的代码示例:
public async Task<int> GetListItemsCountAsync(string siteId, string listId) { var list = await _graphService.Client .Sites[siteId] .Lists[listId] .Request() .Select("itemCount") // 仅请求需要的属性,减少数据传输量 .GetAsync(); return list?.ItemCount ?? 0; }
场景2:获取筛选后的项数量(带查询条件)
如果需要统计符合特定筛选条件的项数量,需调整请求方式:
- 使用
/items/microsoft.graph.listItem/$count专用计数端点 - 必须添加请求头
ConsistencyLevel: eventual(这是Graph API支持筛选后计数的必要条件)
代码示例:
public async Task<int> GetFilteredItemsCountAsync(string siteId, string listId, string filterQuery) { var request = _graphService.Client .Sites[siteId] .Lists[listId] .Items .Count .Request(); // 添加筛选条件 if (!string.IsNullOrEmpty(filterQuery)) { request.QueryOptions.Add(new QueryOption("$filter", filterQuery)); } // 强制添加ConsistencyLevel请求头 request.Headers.Add("ConsistencyLevel", "eventual"); return await request.GetAsync(); }
注意:这种方式会实际执行筛选并统计数量,性能略逊于直接取itemCount,但远优于获取所有项再计数的方案。
内容的提问来源于stack exchange,提问作者Rubén
相关产品推荐
相关产品推荐

