.`ToListAsync()` 的目的是什么

What is the purpose of .`ToListAsync()`

如果我尝试运行这个代码

await _dbContext.Set<T>().ToListAsync();

我会得到这个错误:

InvalidOperationException: The source IQueryable doesn't implement IDbAsyncEnumerable. Only sources that implement IDbAsyncEnumerable can be used for Entity Framework asynchronous operations. For more details see http://go.microsoft.com/fwlink/?LinkId=287068

按照提供的link我们可以读到下面的语句

[...] because they are only designed to be used with Entity Framework you may receive the following error if you try to use them on a LINQ query that isn’t an Entity Framework query.

那为什么我不能在 DbSet 上使用它?对我来说,DbSet 显然是一个与实体框架相关的 class,因为它在 EntityFramework 程序集中找到...

根据 DbSet MSDN documentation,它实现了 IDbAsyncEnumerable.GetAsyncEnumerator()。如果实施了 IDbAsyncEnumerable,为什么不能实施 .ToListAsync() 运行?

此外,通过使用 ReSharper 反编译器深入研究代码,我无法理解它在哪一点出错了......内部使用的 AsDbAsyncEnumerable 方法试图转换我的 DbSet<T>进入一个 IDbAsyncEnumerable<T> 应该可以工作,因为 DbSet 实现了它 ...

此时我的代码使用了以下行,这正是我所期望的 .ToListAsync() 在内部所做的。

await _dbContext.Set<T>().ToAsyncEnumerable().ToList();

为什么不在内部使用 ToAsyncEnumerable?如果 ToListAsync 在正常 IQueryableDbSet 上都不起作用,在哪种情况下会被使用?

Panagiotis Kanavos 和 Henk Holterman 在评论中指出了正确的事情:EF6 不是 EF Core。出于某种原因,我简单地假设这两个是相同的,"core" 是用作别名的奇特名称。可能是因为这个原因,我最终在我的项目中同时拥有了这两者。

我尝试了很多方法来修复错误,但最终我通过简单地从我的项目中删除可能与 Entity Framework 或多或少远程相关的每个包来修复所有问题,除了 Microsoft.NETCore.App 因为它在 .netcote 2.0 应用程序中是强制性的。从那里我开始根据名称空间和 类 添加包,编译器急于使用 MSDN 查找包的名称,它最终再次工作。

现在正确回答我的问题:ToListAsync() 完全按照它应该做的去做。它只是无法识别 EF6 DbContext,因为它不是 EFCore 包的一部分。所以把这两者混在一起不是个好主意。