CosmosDB .NET 如何最简获取容器(container)内所有条目?
实现方案
你可以通过遍历CosmosDB的查询迭代器封装出符合要求的ListAsync方法,最简实现如下:
public async Task<IEnumerable<T>> ListAsync() { var query = _container.GetItemQueryIterator<T>(new QueryDefinition("SELECT * FROM c")); var results = new List<T>(); while (query.HasMoreResults) { results.AddRange(await query.ReadNextAsync()); } return results; }
注意事项
- 如果容器数据量较大,不建议直接全量拉取,会产生过高的RU消耗和性能开销,按需添加过滤条件或分页逻辑更合理
- 如果仅需要查询单个分区下的所有条目,可以给
GetItemQueryIterator传入QueryRequestOptions指定分区键,避免跨分区查询消耗,示例:var options = new QueryRequestOptions { PartitionKey = new PartitionKey("目标分区键值") }; var query = _container.GetItemQueryIterator<T>(new QueryDefinition("SELECT * FROM c"), requestOptions: options);
更简洁的封装方案
你可以把全量查询逻辑封装成Container的通用扩展方法,后续所有容器都可以直接调用,不用重复写迭代逻辑:
public static class CosmosContainerExtensions { public static async Task<IEnumerable<T>> ListAllItemsAsync<T>(this Container container, QueryRequestOptions options = null) { var query = container.GetItemQueryIterator<T>(new QueryDefinition("SELECT * FROM c"), requestOptions: options); var results = new List<T>(); while (query.HasMoreResults) { results.AddRange(await query.ReadNextAsync()); } return results; } }
封装完成后你就可以得到和GetAsync一样简洁的调用形式:
public async Task<IEnumerable<T>> ListAsync() { return await _container.ListAllItemsAsync<T>(); }
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

