【发布时间】:2017-03-27 02:09:07
【问题描述】:
我有一些代码使用 Entity Framework Core 中可用的异步扩展方法:
public async Task<MyResult> DoQuery<T>(IQueryable<T> queryable)
{
var count = await queryable.CountAsync();
var firstItems = await queryable
.Take(5)
.ToArrayAsync();
return new MyResult(count, firstItems);
}
当 IQueryable 我提供的函数直接来自 EF 时,这非常有用。我还想重用这段代码在 LINQ-to-objects“查询”上执行一些逻辑:
var evens = Enumerable.Range(0, 10).Where(i => i % 2 == 0);
var result = DoQuery(evens.AsQueryable());
这失败了(这并不奇怪):
System.InvalidOperationException:源 IQueryable 的提供程序未实现 IAsyncQueryProvider。只有实现 IEntityQueryProvider 的提供程序才能用于实体框架异步操作。
看起来重构是有序的,但我很好奇:有没有办法将一个普通的枚举变成一个“虚拟”AsyncEnumerable 或 AsyncQueryable 同步处理 CountAsync?
【问题讨论】:
标签: c# .net linq entity-framework-core