【问题标题】:What type of collection should be returned from EFCore 3.1 in WebAPI?应该从 Web API 中的 EF Core 3.1 返回什么类型的集合?
【发布时间】:2023-04-05 03:42:02
【问题描述】:

我正在编写 ASP.NET Core 3.1 Web API,但我发现自己很困惑……如果我使用正确的类型返回。

这是我的代码(为简单起见,我删除了分页):

public class UserData
{
    public IEnumerable<UserDto> GetUsers()
    {
        var users = _fni.Users.AsNoTracking()
            .OrderBy(row => row.UserName);

        return _mapper.Map<IEnumerable<UserDto>>(users);
    }
}


[HttpGet]
public IActionResult GetUsers()
{
    var users = _userData.GetUsers();

    return Ok(users);
}

从数据库中查询用户并立即返回给 API 的客户端。在 C# 8 时代,返回这个集合的最佳方式是什么?

  • IEnumerable
  • List&lt;UserDto&gt;
  • async Task&lt;List&lt;UserDto&gt;&gt;
  • IAsyncEnumerable

编辑:问题是关于 EFCore3.1 应该在 UserData 类的数据存储库中返回什么。 不是来自控制器。

【问题讨论】:

  • 返回IActionResult,因为它提供了最大的灵活性,例如返回错误和几乎所有其他内容。使用自定义类型更容易从签名中推断返回,但如果您需要返回错误,则可以使用异常。
  • 在实际传输阶段,集合很容易被展平/简化为普通的旧数组。其他集合类型对于在途的集合没有任何意义。它们仅适用于内存中的集合。但是由于将数组输入或转换为任何其他集合通常很简单,因此您可能不会注意到它有大量处理管道的 Automagic 代码。
  • @CodingYoshi 感谢您的建议,但我确实从我的控制器返回 IActionResult。我的问题(虽然理想情况下很清楚,正如我现在所看到的那样)是关于 EFCore(数据存储库)应该返回什么。你不是说我的数据仓库应该返回IActionResult,是吗?
  • 绝对不是。如果您不希望客户端将项目添加到集合中,您的存储库应返回 IEnumerable&lt;T&gt;。如果您确实希望允许修改集合,那么List&lt;T&gt; 更有意义。返回最有意义的那个。
  • @CodingYoshi 我知道转换为List&lt;T&gt; 的成本很高,只有在我们想修改集合时才应该这样做。所以在单个应用程序中使用IEnumerable 是有意义的。但是我们在谈论 API,数据流看起来像这样:Repo -> Controller -> (convert to json) -> Client app。 “转换为 json”不是和转换为 List 一样昂贵吗?因此,如果我们从 Repo 返回 ListEnumerable 并没有什么区别?

标签: c# asp.net-core entity-framework-core asp.net-core-webapi c#-8.0


【解决方案1】:

通常 IEnumerable 是在将结果发送给请求所有者之前密封结果的不错选择。因此,您可以确定在传输过程中集合没有改变。 (通过任何中级功能等)

如果您打算立即迭代整个列表,

IAsyncEnumerable 也是一个不错的选择。

查看此项以查看 IAsyncEnumerable 的各种用例:https://dotnetcoretutorials.com/2019/01/09/iasyncenumerable-in-c-8/

此外,据我所知,此代码部分属于存储库。您可能需要重新考虑在存储库内使用 dto 映射。由于存储库模式只负责下层数据的管理,因此将数据映射到传输对象不是存储库模式的职责。 (打破单一责任规则)

【讨论】:

  • 您好,请点赞。你介意我在这里问一个后续问题吗?
  • @ycansener 嗯..你说的是“确保集合在传输过程中没有改变”。但是IEnumerable 不是在序列化/转换为json 期间转换为ArrayList 或其他东西吗?
【解决方案2】:

这是来自 Microsoft 的有关 Controller 的返回类型的文档。看看对你有没有帮助

https://docs.microsoft.com/en-us/aspnet/core/web-api/action-return-types?view=aspnetcore-3.1

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 2022-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 2021-10-02
    相关资源
    最近更新 更多