如果我尝试运行此代码
await _dbContext.Set<T>().ToListAsync();
我会收到这个错误:
InvalidOperationException:源 IQueryable 未实现 IDbAsyncEnumerable。只有实现 IDbAsyncEnumerable 的源才能用于实体框架异步操作。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=287068
按照提供的链接,我们可以阅读以下声明
[...] 因为它们仅设计用于实体框架,如果您尝试在不是实体框架查询的 LINQ 查询上使用它们,您可能会收到以下错误。
那为什么我不能在 DbSet 上使用它呢?对我来说,DbSet 显然是一个与实体框架相关的类,因为它可以在 EntityFramework 程序集中找到......
根据DbSet MSDN 文档,它实现了IDbAsyncEnumerable.GetAsyncEnumerator()
。如果IDbAsyncEnumerable
实现了,为什么不能.ToListAsync()
运行?
另外,通过使用 ReSharper 反编译器深入研究代码,我无法理解它在什么时候出错了......AsDbAsyncEnumerable
内部使用的方法试图将我的方法DbSet<T>
转换成一个IDbAsyncEnumerable<T>
应该可以工作的方法,因为DbSet
它实现了它......
此时,我的代码使用以下行,这正是我期望.ToListAsync()
在内部执行的操作。
await _dbContext.Set<T>().ToAsyncEnumerable().ToList();
为什么不ToAsyncEnumerable
内部使用?如果它在 normal和 aToListAsync
上都不起作用,将在哪种情况下使用?IQueryable
DbSet