Entity framework core 我可以(或应该)使用IAsyncEnumerable<;T>;而不是任务<;行动结果<;IEnumerable<;T>&燃气轮机&燃气轮机;在Web API控制器中

Entity framework core 我可以(或应该)使用IAsyncEnumerable<;T>;而不是任务<;行动结果<;IEnumerable<;T>&燃气轮机&燃气轮机;在Web API控制器中,entity-framework-core,asp.net-core-webapi,iasyncenumerable,Entity Framework Core,Asp.net Core Webapi,Iasyncenumerable,我目前有一个web API 使用存储库中的SQLRAW(…).ToListSync()中的获取一行数据 将此数据返回为Ok(data.ToArray())作为它声明不应使用的任务。此处提出的解决方案类似于: FromSqlRaw(...).AsNoTracking().AsAsyncEnumerable() 至于控制器,我希望用ActionResult包装响应,以明确设置返回代码。然而,目前似乎不起作用 我应该将解决方案应用于存储库并将结果作为列表使用在我的控制器中还是保持原样?IAsync

我目前有一个web API

  • 使用存储库中的SQLRAW(…).ToListSync()中的
    获取一行数据
  • 将此数据返回为
    Ok(data.ToArray())
    作为它声明不应使用的
    任务。此处提出的解决方案类似于:

    FromSqlRaw(...).AsNoTracking().AsAsyncEnumerable()
    
    至于控制器,我希望用
    ActionResult
    包装响应,以明确设置返回代码。然而,目前似乎不起作用


    我应该将解决方案应用于存储库并将结果作为列表使用在我的控制器中还是保持原样?

    IAsyncEnumerable
    为您提供了一个数据检索接口。换句话说,此API表示一个迭代器,其中异步获取下一项

    这意味着您将分几轮接收数据,每轮都以异步方式接收

    • 先前的
      IAsyncEnumerable
      可以使用
      IEnumerable
      ,它表示一组返回类型为
      T
      的异步操作

    • Task
      表示一个异步操作,返回类型为
      IEnumerable


    让我们将这些知识应用于WebAPI:

    • 从HTTP消费者的角度来看,
      Task
      ActionResult
      之间没有区别。从用户的角度来看,这是一个实现细节
    • WebAPI控制器的操作实现了请求-响应模型。这意味着在消费者端发送单个请求并接收单个响应
    • 如果消费者再次调用相同的操作,那么将实例化一个新的控制器并处理该请求

    这意味着您的API的使用者不能利用
    IAsyncEnumerable
    ,如果它作为操作结果类型公开。

    我认为答案是,API的使用者永远不会收到等待的结果,而只会收到结果。至于控制器,它永远不会,因为JSON解析器正在接收异步流并将其作为一个单一的结果交付(已经有了一个线程,但我现在找不到它)。我试图让我的存储库使用
    System.linq
    ToListAsync()
    将控制器使用的异步流返回到
    列表中。它可以工作,但我不知道这是否破坏了
    IAsyncEnumerable
    的目的,因为控制器现在必须等待它。但是响应可以是连续的,例如,当您返回
    PushStreamContent
    内容时。@AgentFire是的,但我认为从问题的角度来看,它超出了范围。谢谢。所以我没有理由想要像
    ActionResult
    这样的东西,这可能是它在语法上不可能的原因。但是,如果将
    IAsyncEnumerable
    作为控制器中的列表使用,我是否仍能获得
    Task
    (无论这些是什么)的优势?@Beltway如果满足以下条件,则是,这可能是有意义的:1)单个元素将在未来的不同时间可用2)您不想在开始使用已经可用的元素之前等待所有元素。至于1):我使用的是
    .AsNoTracking()
    ,因为数据的真实性并不那么重要,如果我没弄错,那也没关系。至于2):从性能和并发性方面来说,这通常不是一个有利的选择吗?只要
    iasynceneumerable
    中没有我不知道的缺点,我就选择它。