C# 如何将CosmosDB FeedIterator结果转换为IAsyncEnumerable或IEnumerable?
要从CosmosDb FeedIterator中获取数据,并以简单的可重用方式将其转换为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")
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分支:哦!美好的我不知道。非常感谢。