首页 > 解决方案 > 如何将 CosmosDB FeedIterator 结果转换为 IAsyncEnumerable 或 IEnumerable?

问题描述

将 CosmosDb FeedIterator 中的数据以一种简单的可重用方式转换为 IEnumerable 有点棘手,而无需到处编写循环和迭代。

不像我喜欢的那样整洁的微软官方示例如下所示:

using (FeedIterator setIterator = container.GetItemLinqQueryable<Book>()
                     .Where(b => b.Title == "War and Peace")
                     .ToFeedIterator())
{                   
    //Asynchronous query execution
    while (setIterator.HasMoreResults)
    {
        foreach(var item in await setIterator.ReadNextAsync())
        {
            Console.WriteLine(item.Price); 
        }
    }
}

我想要一个可重复使用的oneliner,但没有找到,所以我写了一个。

特别是当它要在 .NET API 中使用时,所以我编写了一个扩展方法来将 FeedIterator 转换为 IAsyncEnumerable,您可以使用

(在 C# 8 中,您可以从 API 返回 IAsyncEnumerable,但如果您需要像我一样与 netstandard2.0 兼容,您可以将 IAsyncEnumerable 转换为常规 IEnumerable)

标签: c#azure-cosmosdb

解决方案


这就是我解决它的方法:

扩展方法:

public static class CosmosDbExtensions
{
    /// <summary>
    /// Convert a feed iterator to IAsyncEnumerable
    /// </summary>
    /// <typeparam name="TModel"></typeparam>
    /// <param name="setIterator"></param>
    /// <returns></returns>
    public static async IAsyncEnumerable<TModel> ToAsyncEnumerable<TModel>(this FeedIterator<TModel> setIterator)
    {
        while (setIterator.HasMoreResults)
            foreach (var item in await setIterator.ReadNextAsync())
            {
                yield return item;
            }
    }
}

要返回 IAsyncEnumerable:

 public virtual IAsyncEnumerable<TModel> Query()
    {
        Container container = GetContainer(); // Your code to get container 

        return  container.GetItemLinqQueryable<TModel>().ToFeedIterator().ToAsyncEnumerable();
    }

要返回 IEnumerable:

public virtual async Task<IEnumerable<TModel>> Query()
{

    Container container = GetContainer(); // Your code to get container 

    using (var feedIterator = container.GetItemLinqQueryable<TModel>().ToFeedIterator())
    {
        return await feedIterator.ToAsyncEnumerable().ToListAsync();
    }
}

(有关此线程中 System.Linq.Async 包中的 .ToListAsync() 的更多信息)


推荐阅读