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