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

时间:2017-10-17 08:31:46

标签: c# entity-framework-6 .net-core-2.0 ef-core-2.0

如果我尝试运行此代码

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

我会收到此错误:

  

InvalidOperationException:源IQueryable未实现IDbAsyncEnumerable。只有实现IDbAsyncEnumerable的源才能用于Entity Framework异步操作。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=287068

按照提供的link,我们可以阅读以下声明

  

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

那为什么我不能在DbSet上使用它?对我来说,DbSet显然是一个与实体框架相关的类,因为它可以在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上都不起作用,那么会使用@Text 吗?

1 个答案:

答案 0 :(得分:2)

Panagiotis Kanavos和Henk Holterman在评论中指出了正确的观点:EF6不是EF Core。出于某种原因,我只是假设这两个是相同的,并且&#34;核心&#34;是一个用作别名的花哨名称。可能是因为这个原因我最终在我的项目中都有了。

我尝试了很多方法来修复错误,但最终我修复了所有内容,只需从我的项目中删除可能与Entity Framework或多或少远程相关的每个包,除了@input = EXTRACT [applicationname] string, [clientip] string, [continent] string, [country] string, [province] string, [city] string, [latitude] string, [longitude] string FROM "adl://mydatalakesotre.azuredatalakestore.net/instrumentationoutput/mystore/2017-10-22/{*}" USING Extractors.Text(delimiter: '\t', skipFirstNRows: 1, silent: true); OUTPUT @input TO "output/PowerBI_output.tsv" USING Outputters.Tsv(outputHeader: true); 因为它&#39 ;在.netcote 2.0应用中必须使用。从那里开始,我开始添加包,这取决于编译器在使用MSDN查找软件包名称时所使用的名称空间和类,并最终再次起作用。

现在要正确回答我的问题:Microsoft.NETCore.App完全按照它应该做的做法。它只是不识别EF6 ToListAsync(),因为它不是EFCore包的一部分。所以将这两者混合起来并不是一个好主意。