EF Core异步客户端评估



使用net5.0。所以我有这个问题:

context.DbSet
.Where() // server side
.AsEnumerable()
.Where() // can't be translated to SQL so client side
.ToList();

那么,我们如何实现这种异步变体呢?我想它会这样工作:

await context.DbSet
.Where() // server side
.AsAsyncEnumerable()
.Where() // can't be translated to SQL so client side
.ToListAsync();

但这行不通。什么是正确的方法?

正如EF Core文档的显式客户评估部分所提到的,EF Core团队的愿景是

如果您正在使用AsAsyncEnumerable,并且希望在客户端进一步组成查询,那么您可以使用System.Interactive.Async库,该库定义异步枚举的运算符。有关更多信息,请参阅客户端linq运算符。

因此,根据想法,您需要安装该软件包并使用

await context.DbSet
.Where() // server side
.AsAsyncEnumerable()
.Where(...) // this is provided by System.Interactive.Async
.ToList(); // as well this

请注意,当您引用两个包时(System.Interactive.AsyncMicrosoft.EntityFrameworkCore,因为EF CoreDbSet<T>同时实现了IEnumerable<T>IAsyncEnumerable<T>,这使得一些扩展方法调用不明确(,因此您可能会开始出现编译时错误。他们的GitHub问题跟踪器中存在公开问题,但两个团队都不愿意修复这些问题,并表示问题是由另一个团队引起的。微软最近采用的开放源代码策略的缺点之一。

最新更新