ToAsyncEnumerable().Single()vs SingleAsync()

Hap*_*mad 5 linq entity-framework system.reactive entity-framework-core .net-core

我正在以独立于EF-Core的方式构建和执行我的查询,所以我依赖于IQueryable<T>获得所需的抽象级别.我正在等待等待SingleAsync()电话的等待ToAsyncEnumerable().Single()电话.我也用ToListAsync()电话取代ToAsyncEnumerable().ToList()电话.但我刚刚发现了这个ToAsyncEnumerable()方法,所以我不确定我是否正确使用它.

为了澄清我所指的扩展方法,它们的定义如下:

  • SingleAsync并在命名空间和程序ToListAsync集中的EntityFrameworkQueryableExtensions类上定义Microsoft.EntityFrameworkCore.
  • ToAsyncEnumerable在程序集AsyncEnumerable的System.Linq命名空间中的类上定义System.Interactive.Async.

当查询针对EF-Core运行时,调用ToAsyncEnumerable().Single()/ToList()与SingleAsync()/ToListAsync()功能和性能的等效性相比如何?如果没有,那么它们有何不同?

Iva*_*oev 6

对于返回序列的方法(比如ToListAsync,ToArrayAsync),我不希望有任何区别.

然而,对于单个值返回的方法(的异步版本First,FirstOrDefault,Single,Min,Max,Sum等),绝对会有差异.通过在IQueryable<T>vs 上执行这些方法,它与差异相同IEnumerable<T>.在前一种情况下,它们由数据库查询处理,向客户端返回单个值,而在稍后,整个结果集将返回到客户端并在内存中处理.

因此,虽然通常抽象EF Core的想法很好,但它会导致性能问题,IQueryable<T>因为可查询的异步处理不是标准化的,并且转换为IEnumerable<T>更改执行上下文,因此实现单值返回LINQ方法.

PS标准化我指的是以下内容.同步处理IQueryable由IQueryProvider(程序集中的命名空间的标准接口)方法提供.异步处理需要引入类似于EF Core 自定义的另一个标准接口(在程序集中的内部命名空间).我想这需要BCL团队的合作/批准并需要时间,这就是为什么他们现在决定采取自定义路径.System.LinqSystem.Core.dllExecute IAsyncQueryProviderMicrosoft.EntityFrameworkCore.Query.InternalMicrosoft.EntityFrameworkCore.dll