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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:54:04