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