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)
小智 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)
| 归档时间: |
|
| 查看次数: |
8060 次 |
| 最近记录: |