如果我尝试运行此代码

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/

10-13 01:22