C# 最好返回任务<;列表<;T>&燃气轮机;或IEnumerable<;T>;通过WebAPI端点?

C# 最好返回任务<;列表<;T>&燃气轮机;或IEnumerable<;T>;通过WebAPI端点?,c#,asynchronous,asp.net-web-api,async-await,C#,Asynchronous,Asp.net Web Api,Async Await,考虑以下两个例子: 选择1 同步端点和repo调用不会将实体加载到内存中,返回IEnumerable作为结果: MyController [HttpGet] public IHttpActionResult GetAll() { IEnumerable<T> result = _repo.GetAll(); return Ok(result); } [HttpGet] public async Task<IHttpActionResult> GetAl

考虑以下两个例子:

选择1 同步端点和repo调用不会将实体加载到内存中,返回
IEnumerable
作为结果:

MyController

[HttpGet]
public IHttpActionResult GetAll() {
    IEnumerable<T> result = _repo.GetAll();

    return Ok(result);
}
[HttpGet]
public async Task<IHttpActionResult> GetAll() {
    List<T> result = await _repo.GetAll();

    return Ok(result);
}
[HttpGet]
公共IHttpActionResult GetAll(){
IEnumerable结果=_repo.GetAll();
返回Ok(结果);
}
MyRepo

public IEnumerable<T> GetAll() {
    return GetSet<T>(); // EF DbSet (IQueryable<T>)
}
public Task<List<T>> GetAll() {
    return GetSet<T>().ToListAsync(); // EF DbSet (Task<List<T>>)
}
public IEnumerable GetAll(){
return GetSet();//EF DbSet(IQueryable)
}

选择2 异步控制器和repo调用将实体加载到内存中(尽管是异步的):

MyController

[HttpGet]
public IHttpActionResult GetAll() {
    IEnumerable<T> result = _repo.GetAll();

    return Ok(result);
}
[HttpGet]
public async Task<IHttpActionResult> GetAll() {
    List<T> result = await _repo.GetAll();

    return Ok(result);
}
[HttpGet]
公共异步任务GetAll(){
列表结果=等待_repo.GetAll();
返回Ok(结果);
}
MyRepo

public IEnumerable<T> GetAll() {
    return GetSet<T>(); // EF DbSet (IQueryable<T>)
}
public Task<List<T>> GetAll() {
    return GetSet<T>().ToListAsync(); // EF DbSet (Task<List<T>>)
}
public任务GetAll(){
return GetSet().ToListAsync();//EF DbSet(任务)
}

哪个更好?
首选的方法是什么?要异步“流式”结果还是预加载结果?在我看来,来自未知大小的数据库表/查询的任何形式的
ToList
,都是一个糟糕的举动,我通常会避免这样做。但我也想从
async/await
的好处中获益。目前,任何返回多个实体的my repo方法都是非异步的,而其他方法是异步的。

在返回响应之前,需要具体化查询。这是你唯一需要担心的事。DbContext的生存期是多少?请记住,客户端无法访问DbContext,因此必须在返回之前读取所有数据。Web Api场景中不支持延迟加载Nevermind Josh,我误读了你的问题Async将帮助你释放线程,直到加载工作完成,这是一个很好的解决方案。这里唯一的问题是,您将以何种格式返回数据,这就是我发布链接的原因。@Thanigainathan然后每个repo调用都会将整个集合拉入内存。
同步端点和repo调用不会将实体加载到内存中
-您确定吗?一种简单的检查方法是检查响应的
内容长度
标题;如果存在,则ASP.NET会在写入响应之前将整个结果集吸进内存。