如果我尝试运行此代码
await _dbContext.Set<T>().ToListAsync();
我会收到这个错误:
通过遵循提供的 link 我们可以阅读以下语句
那为什么我不能在 DbSet 上使用它呢?对我来说,DbSet 显然是一个与 Entity Framework 相关的类,因为它可以在 EntityFramework 程序集中找到......
根据 DbSet MSDN documentation ,它实现了
IDbAsyncEnumerable.GetAsyncEnumerator()
。如果实现了 IDbAsyncEnumerable
,为什么 .ToListAsync()
不能运行?另外,通过使用 ReSharper 反编译器深入研究代码,我无法理解它在哪一点出错......内部使用的
AsDbAsyncEnumerable
方法试图将我的 DbSet<T>
转换为 IDbAsyncEnumerable<T>
,因为 DbSet
实现了它应该可以工作......此时我的代码使用以下行,这正是我期望
.ToListAsync()
在内部执行的操作。await _dbContext.Set<T>().ToAsyncEnumerable().ToList();
为什么不在内部使用
ToAsyncEnumerable
?在哪种情况下,如果 ToListAsync
既不适用于普通 IQueryable
也不适用于 DbSet
,则会使用它? 最佳答案
Panagiotis Kanavos 和 Henk Holterman 在评论中指出了正确的一点:EF6 不是 EF Core。出于某种原因,我只是假设这两个是相同的,“核心”是用作别名的花哨名称。可能正是出于这个原因,我最终在我的项目中同时拥有了这两者。
我尝试了很多方法来修复错误,但最终我通过简单地从我的项目中删除每个可能与 Entity Framework 或多或少远程相关的包来解决所有问题,但 Microsoft.NETCore.App
除外,因为它在 .netcote 2.0 应用程序中是强制性的。从那里我开始根据编译器为使用 MSDN 查找包的名称而哭泣的 namespace 和类来添加包,并最终再次起作用。
现在来正确回答我的问题:ToListAsync()
正是它应该做的。它只是无法识别 EF6 DbContext
,因为它不是 EFCore 包的一部分。所以把这两个混在一起不是一个好主意。
关于c# - .`ToListAsync()` 的目的是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46785815/