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

问题描述:

如果我尝试运行这段代码什么是.`ToListAsync的目的()`

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

我会得到这个错误:

出现InvalidOperationException:源的IQueryable没有实现IDbAsyncEnumerable 。只有实现IDbAsyncEnumerable的源才能用于实体框架异步操作。欲了解更多详情,请参见http://go.microsoft.com/fwlink/?LinkId=287068

通过下面提供的link我们可以仔细阅读以下声明

[...],因为他们只设计与实体框架一起使用时可能会收到以下错误如果您尝试在不是实体框架查询的LINQ查询上使用它们。

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

按照DbSet MSDN documentation,它实现了IDbAsyncEnumerable.GetAsyncEnumerator()。如果执行IDbAsyncEnumerable,为什么不能运行.ToListAsync()

此外,通过使用反编译ReSharper的挖掘到的代码我不明白,此时出了问题......在内部使用尝试我DbSet<T>铸成IDbAsyncEnumerable<T>AsDbAsyncEnumerable方法应该因为DbSet器具工作它...

在这一点上我的代码使用以下行,这正是我期望.ToListAsync()内部做的。

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

为什么ToAsyncEnumerable在内部使用?在这种情况下,如果ToListAsync不适用于正常的IQueryableDbSet,则可以使用ToListAsync

+0

发布*可重现的*例子。 *您的目标是哪个*框架和*哪个数据库? EF6不是EF Core 2.0。我使用'ToListAsync',但我更喜欢'ToArrayAsync' –

+5

您已经标记了Ef6和EfCore2,请先下定决心。 –

+0

这可能是一个糟糕的混合... ToListAsync()是一种扩展方法。 –

Panagiotis Kanavos和Henk Holterman在评论中指出了正确的东西:EF6不是EF Core。出于某种原因,我简单地认为这两者是相同的,“核心”是用作别名的花哨名称。这可能是因为这个原因,我最终都在我的项目中。

我尝试了很多事情来修复错误,但最终我通过简单地删除了每个可能与我的项目或多或少都与实体框架相关的包,但Microsoft.NETCore.App因为它在.netcote 2.0中是强制性的应用。从那里我开始添加软件包,取决于什么名称 - 编译器在使用MSDN来查找软件包名称时所使用的空格和类,并最终再次运行。

现在正确回答我的问题:ToListAsync()完全是它应该做的。它只是不承认EF6 DbContext,因为它不是EFCore包的一部分。所以混合这两个不是一个好主意。