LINQ ToList()在异步方法上引发错误

本文关键字:错误 异步方法 ToList LINQ | 更新日期: 2023-09-27 18:00:03

我有以下方法:

protected override async Task<IHttpActionResult> GetAll(QueryData query)
{
     IEnumerable<Entity> entities = await _entityManager.UseRepositoryAsync(async (repo) =>
     {
          var fetchExpression = FetchExpression(query);
          IEnumerable<Entity> found = await (fetchExpression != null ?
                                      repo.BrowseAllAsync(fetchExpression) :
                                      repo.BrowseAllAsync());
          return found;
     });
     return Ok(entities.Select(e => MapToDTO(e));
}

此函数编译良好。

然而,如果我继续在末尾添加ToList(),它会抛出一个错误:

由于System.Func<XXX.Framework.Persistence.IAsyncRepository<Entity>,System.Threading.Tasks.Task>是一个返回Task的异步方法,所以return关键字后面不能跟对象表达式。

您打算归还Task<T>吗?

protected override async Task<IHttpActionResult> GetAll(QueryData query)
{
     IEnumerable<Entity> entities = await _entityManager.UseRepositoryAsync(async (repo) =>
     {
          var fetchExpression = FetchExpression(query);
          IEnumerable<Entity> found = await (fetchExpression != null ?
                                      repo.BrowseAllAsync(fetchExpression) :
                                      repo.BrowseAllAsync());
          return found.ToList(); //THROWS ERROR
     });
     return Ok(entities.Select(e => MapToDTO(e));
}

我无法理解错误信息。怎么回事?

注意UseRepositoryAsync是一个重载方法,具有以下sintax:

Task<R> UseRepositoryAsync(Func<IAsyncRepository<E>, Task<R>> operation);
Task UseRepositoryAsync(Func<IAsyncRepository<E>, Task> operation);

LINQ ToList()在异步方法上引发错误

您的方法签名显示:

Task<R> UseRepositoryAsync(Func<IAsyncRepository<E>, Task<R>> operation);

但是,返回的Task实际上是Task<IEnumerable<R>>(其中R是Entity),因为您返回的是集合而不是单个项。由于您的方法的最佳重载当前是Task,并且您使用的是async-await,因此当您尝试从lambda返回任何内容时,编译器会大喊大叫。

更改过载以接收并返回集合:

Task<IEnumerable<R>> UseRepositoryAsync(Func<IAsyncRepository<E>, Task<IEnumerable<R>> operation);