c# - 如何将 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)
解决方案
这就是我解决它的方法:
扩展方法:
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() 的更多信息)
推荐阅读
- typo3 - 如何为 tx-news 中的自定义字段翻译选择框“排序依据”的标签
- java - 即使安装了 java 11,Java Runtime 也只能识别最高 52.0 的类文件版本
- python - 在 mat2py 如何修复错误 AttributeError: 'numpy.ndarray' object has no attribute 'get_svm_type'
- reactjs - 我如何将数据从这里传输到这里
- angular - 渲染列表项时显示无穷大的点
- java - 什么是在对象中只允许一个非空字段的好方法
- jvm - 将 Spring Boot 应用程序部署到 Cloud Foundry 失败并出现 JVM 内存问题
- python - 如何在带有 RNN 的 Tensorflow 模型中优雅地调试 nan/inf 梯度?
- python - 试图打印一个 int 但它出现:TypeError must be str, not float
- python - 如何在多用户使用的unix服务器上集中调度r和python脚本