您可以在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;
}
}
}