C# 如何将CosmosDB FeedIterator结果转换为IAsyncEnumerable或IEnumerable?

C# 如何将CosmosDB FeedIterator结果转换为IAsyncEnumerable或IEnumerable?,c#,azure-cosmosdb,C#,Azure Cosmosdb,要从CosmosDb FeedIterator中获取数据,并以简单的可重用方式将其转换为IEnumerable,而不必到处编写循环和迭代,这有点棘手 没有我喜欢的那么整洁的房间看起来是这样的: using (FeedIterator setIterator = container.GetItemLinqQueryable<Book>() .Where(b => b.Title == "War and Peace")

要从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); 
        }
    }
}
使用(FeedIterator setIterator=container.GetItemLinqQueryable()
.其中(b=>b.标题==“战争与和平”)
.ToFeedIterator())
{                   
//异步查询执行
while(setIterator.HasMoreResults)
{
foreach(wait setIterator.ReadNextAsync()中的var项)
{
控制台写入线(项目价格);
}
}
}
我想要一个可重复使用的oneliner,但没有找到,所以我写了一个

尤其是在.NETAPI中使用它时,所以我编写了一个扩展方法,将FeedIterator转换为IAsyncEnumerable,您可以使用


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

我就是这样解决的:

扩展方法:

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;
            }
    }
}
 public virtual IAsyncEnumerable<TModel> Query()
    {
        Container container = GetContainer(); // Your code to get container 

        return  container.GetItemLinqQueryable<TModel>().ToFeedIterator().ToAsyncEnumerable();
    }
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();
    }
}
公共静态类CosmosDbExtensions
{
/// 
///将提要迭代器转换为IAsyncEnumerable
/// 
/// 
/// 
/// 
公共静态异步IAsyncEnumerable到SyncEnumerable(此FeedIterator集合迭代器)
{
while(setIterator.HasMoreResults)
foreach(wait setIterator.ReadNextAsync()中的var项)
{
收益回报项目;
}
}
}
返回IAsyncEnumerable:

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;
            }
    }
}
 public virtual IAsyncEnumerable<TModel> Query()
    {
        Container container = GetContainer(); // Your code to get container 

        return  container.GetItemLinqQueryable<TModel>().ToFeedIterator().ToAsyncEnumerable();
    }
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();
    }
}
公共虚拟IAsyncEnumerable查询()
{
Container Container=GetContainer();//获取容器的代码
返回container.GetItemLinqQueryable().ToFeedIterator().ToAsyncEnumerable();
}
返回IEnumerable:

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;
            }
    }
}
 public virtual IAsyncEnumerable<TModel> Query()
    {
        Container container = GetContainer(); // Your code to get container 

        return  container.GetItemLinqQueryable<TModel>().ToFeedIterator().ToAsyncEnumerable();
    }
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();
    }
}
公共虚拟异步任务查询() { Container Container=GetContainer();//获取容器的代码 使用(var feedIterator=container.GetItemLinqQueryable().ToFeedIterator()) { 返回wait wait feedIterator.ToAsyncEnumerable().ToListSync(); } }
(有关中System.Linq.Async包中的.toListSync()的更多信息)

我相信这是SDK的v4分支:哦!美好的我不知道。非常感谢。