.`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
在正常 IQueryable
和 DbSet
上都不起作用,在哪种情况下会被使用?
Panagiotis Kanavos 和 Henk Holterman 在评论中指出了正确的事情:EF6 不是 EF Core。出于某种原因,我简单地假设这两个是相同的,"core" 是用作别名的奇特名称。可能是因为这个原因,我最终在我的项目中同时拥有了这两者。
我尝试了很多方法来修复错误,但最终我通过简单地从我的项目中删除可能与 Entity Framework 或多或少远程相关的每个包来修复所有问题,除了 Microsoft.NETCore.App
因为它在 .netcote 2.0 应用程序中是强制性的。从那里我开始根据名称空间和 类 添加包,编译器急于使用 MSDN 查找包的名称,它最终再次工作。
现在正确回答我的问题:ToListAsync()
完全按照它应该做的去做。它只是无法识别 EF6 DbContext
,因为它不是 EFCore 包的一部分。所以把这两者混在一起不是个好主意。
如果我尝试运行这个代码
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
在正常 IQueryable
和 DbSet
上都不起作用,在哪种情况下会被使用?
Panagiotis Kanavos 和 Henk Holterman 在评论中指出了正确的事情:EF6 不是 EF Core。出于某种原因,我简单地假设这两个是相同的,"core" 是用作别名的奇特名称。可能是因为这个原因,我最终在我的项目中同时拥有了这两者。
我尝试了很多方法来修复错误,但最终我通过简单地从我的项目中删除可能与 Entity Framework 或多或少远程相关的每个包来修复所有问题,除了 Microsoft.NETCore.App
因为它在 .netcote 2.0 应用程序中是强制性的。从那里我开始根据名称空间和 类 添加包,编译器急于使用 MSDN 查找包的名称,它最终再次工作。
现在正确回答我的问题:ToListAsync()
完全按照它应该做的去做。它只是无法识别 EF6 DbContext
,因为它不是 EFCore 包的一部分。所以把这两者混在一起不是个好主意。