【问题标题】:CosmosDB Dotnet - Get All Items in a containerCosmosDB Dotnet - 获取容器中的所有项目
【发布时间】:2021-11-17 11:03:09
【问题描述】:

我正在尝试找出将所有项目放入容器中的最简单方法。我已经看到了几种方法,它们看起来都比它应该的复杂。有什么想法吗?

        public async Task<IEnumerable<T>> ListAsync()
        {
            return _container.//Something
        }

我希望存在像这个 GetAsync 方法这样简单的东西。

        public async Task<T> GetAsync(Guid id)
        {
            return await _container.ReadItemAsync<T>(id.ToString(), new PartitionKey(id.ToString()));
        }

谢谢! :)

【问题讨论】:

    标签: c# .net .net-core azure-cosmosdb


    【解决方案1】:

    您可以在IAsyncEnumerable 中使用GetItemQueryIterator

    此方法为 Azure 中容器下的项目创建查询 Cosmos 数据库使用带有参数化值的 SQL 语句。它 返回一个 FeedIterator。有关准备 SQL 的更多信息 具有参数化值的语句,

    例子

    //Some Query
    public static async IAsyncEnumerable<T> GetAllAsync<T>(string query) 
    { 
       var definition = new QueryDefinition(query);
       var iterator = _container.GetItemQueryIterator<T>(definition);
    
       while (iterator.HasMoreResults)
          foreach (var item in await iterator.ReadNextAsync().ConfigureAwait(false))
             yield return item;
    }
    

    或者您可以向GetItemQueryIterator 提供 null 或空参数列表

    public static async IAsyncEnumerable<T> GetAllAsync<T>() 
    { 
       var iterator = _container.GetItemQueryIterator<T>();
    
       while (iterator.HasMoreResults)
          foreach (var item in await iterator.ReadNextAsync().ConfigureAwait(false))
             yield return item;
    }
    

    用法

    await foreach (var item in GetAllAsync<Bob>())
       Console.WriteLine(item);
    

    如果你安装了System.Linq.Async nuget,你可以调用ToListAsync

    var results = await GetAllAsync<Bob>().ToListAsync();
    

    如果你不想依赖,你可以自己滚动

    public static class Extensions
    {
       public static ValueTask<List<TSource>> ToListAsync<TSource>(
          this IAsyncEnumerable<TSource> source, 
          CancellationToken cancellationToken = default)
       {
          if (source is null) throw new ArgumentNullException(nameof(source));
    
          return Local(source, cancellationToken);
    
          static async ValueTask<List<TSource>> Local(IAsyncEnumerable<TSource> source, CancellationToken cancellationToken)
          {
             var list = new List<TSource>();
             await foreach (var item in source.WithCancellation(cancellationToken).ConfigureAwait(false))
                list.Add(item);
             return list;
          }
       }
    }
    

    【讨论】:

    • 不错,完美的解决方案!感谢那。我刚刚在这里删除了查询字符串,它运行良好 -> var iterator = _container.GetItemQueryIterator();
    • @Sean 很有趣,我不知道您可以完全省略查询字符串。无论如何很高兴它有帮助,祝你好运
    猜你喜欢
    • 2020-08-16
    • 2021-07-27
    • 2022-06-15
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多