gpt4 book ai didi

entity-framework - ToAsyncEnumerable().Single() 与 SingleAsync()

转载 作者:行者123 更新时间:2023-12-04 18:02:53 25 4
gpt4 key购买 nike

我正在以独立于 EF-Core 的方式构建和执行我的查询,所以我依赖 IQueryable<T>以获得所需的抽象级别。我正在替换等待的 SingleAsync()调用等待 ToAsyncEnumerable().Single()来电。我也在替换 ToListAsync()ToAsyncEnumerable().ToList() 通话来电。但我只是碰巧遇到了ToAsyncEnumerable()方法,所以我不确定我是否正确使用它。

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

  • SingleAsyncToListAsyncEntityFrameworkQueryableExtensions 上定义Microsoft.EntityFrameworkCore 中的类命名空间和程序集。
  • ToAsyncEnumerable定义在 AsyncEnumerable System.Linq 中的类System.Interactive.Async 中的命名空间部件。

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

    最佳答案

    对于返回序列的方法(如 ToListAsyncToArrayAsync ),我不希望有区别。

    但是对于单值返回方法(FirstFirstOrDefaultSingleMinMaxSum 等的异步版本)肯定会有区别。与在IQueryable<T>上执行这些方法的区别相同。对比 IEnumerable<T> .在前一种情况下,它们由数据库查询处理,将单个值返回给客户端,而在后一种情况下,整个结果集将返回给客户端并在内存中处理。

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

    附言通过标准化,我的意思如下。 IQueryable的同步处理由 IQueryProvider 提供( 标准 接口(interface)来自 System.Linq 命名空间在 System.Core.dll 程序集中)Execute方法。异步处理需要引入另一个 标准 类似于 EF Core 的接口(interface)定制 IAsyncQueryProvider (在 Microsoft.EntityFrameworkCore.Query.Internal 程序集中的 Microsoft.EntityFrameworkCore.dll 命名空间内)。我想这需要 BCL 团队的合作/批准并且需要时间,这就是他们决定现在采取自定义路径的原因。

    关于entity-framework - ToAsyncEnumerable().Single() 与 SingleAsync(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40560915/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com