如果我尝试运行此代码
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
在普通IQueryable
和DbSet
上都不起作用,那么会使用@Text
吗?
答案 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包的一部分。所以将这两者混合起来并不是一个好主意。