如何在 CosmosDB SDK v3.0 异步查询中使用 LINQ?

Fra*_*llo 11 azure-cosmosdb azure-cosmosdb-sqlapi

我一直在关注这里的官方文档:https : //docs.microsoft.com/en-us/azure/cosmos-db/sql-api-get-started#Query

但是我不知道如何在 SQL 字符串上正确使用 LINQ 表达式。我尝试了 GetItemLinqQueryable,但我不知道使用它是否正确。也不是异步的。

var db = Client.GetDatabase(databaseId);
var container = db.GetContainer(containerId);

var q = container.GetItemLinqQueryable<Person>();
var result = q.Where(p => p.Name == "Name").ToList();
Run Code Online (Sandbox Code Playgroud)

这是将 LINQ 与 Cosmos v3 一起使用的正确方法,以及如何使其异步?

Chr*_*SFT 19

你会使用ToFeedIterator()FeedIterator<T>.ReadNextAsync()

var db = Client.GetDatabase(databaseId);
var container = db.GetContainer(containerId);

var q = container.GetItemLinqQueryable<Person>();
var iterator = q.Where(p => p.Name == "Name").ToFeedIterator();
var results = await iterator.ReadNextAsync();
Run Code Online (Sandbox Code Playgroud)

  • 希望他们只支持 ToListAsync (或 ToArrayAsync)和 IAsyncEnumerable (10认同)
  • 顺便说一句,ToFeedIterator() 可以在 Microsoft.Azure.Cosmos.Linq 中找到 (6认同)
  • 您可以在此处找到示例 https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.cosmos.container.getitemlinqqueryable?view=azure-dotnet (4认同)

小智 12

如果您的应用程序遵循分层架构,并且您希望域层完全控制查询,那么可以使用实现例如的自IQueryable<Person>定义来包装 cosmosIQueryProviderIAsyncEnumerable

通过这样做,您可以隐藏域层中异步迭代结果的实现细节。

持久层

public class PersonRepository
{
    public IQueryable<Person> Persons => _cosmosContainer.GetItemLinqQueryable<Person>().ToCosmosAsyncQueryable();
}
Run Code Online (Sandbox Code Playgroud)

领域层

var persons = await _personRepository.Persons
    .Where(p => p.Name == "Name")
    .AsAsyncQueryable()
    .ToListAsync(cancellationToken);
Run Code Online (Sandbox Code Playgroud)
  • ToListAsync可以从System.Linq.Async您的域层引用

域层扩展

var persons = await _personRepository.Persons
    .Where(p => p.Name == "Name")
    .AsAsyncQueryable()
    .ToListAsync(cancellationToken);
Run Code Online (Sandbox Code Playgroud)

持久层扩展

public static IAsyncEnumerable<T> AsAsyncQueryable<T>(this IQueryable<T> queryable)
{
    return (IAsyncEnumerable<T>)queryable;
}
Run Code Online (Sandbox Code Playgroud)