代码之家  ›  专栏  ›  技术社区  ›  Mathieu VIALES Pavel

目的是什么`ToListAsync()`

  •  3
  • Mathieu VIALES Pavel  · 技术社区  · 7 年前

    如果我试着运行这个代码

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

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

    通过遵循提供的 link 我们可以阅读以下声明

    [...] 由于它们仅设计用于实体框架,如果您尝试在不是实体框架查询的LINQ查询中使用它们,则可能会收到以下错误。

    那么为什么我不能在数据库集上使用它呢?对我来说,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 也不是 数据库集

    1 回复  |  直到 7 年前
        1
  •  2
  •   Mathieu VIALES Pavel    7 年前

    Panagiotis Kanavos和Henk Holterman在评论中指出了正确的事情:EF6不是EF核心。出于某种原因,我只是假设这两者是相同的,“core”是一个花哨的名字,用作别名。可能正是因为这个原因,我最终在我的项目中同时拥有了这两个方面。

    我尝试了很多方法来修复错误,但最终我修复了所有问题,只需从我的项目中删除每一个可能或多或少与实体框架有远程关系的包,除了 Microsoft.NETCore.App 因为这是强制性的。netcote 2.0应用程序。从那以后,我开始根据编译器使用MSDN查找包的名称而抱怨的名称空间和类来添加包,最终它再次工作了。

    ToListAsync() DbContext 因为,它不是EFCore包的一部分。所以把这两者混为一谈不是个好主意。