LINQ ToList()在异步方法

时间:2015-06-26 19:22:03

标签: c# .net linq asynchronous async-await

我有以下方法:

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的异步方法,因此返回关键字后面不能包含对象表达式。

     

您打算返回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);

1 个答案:

答案 0 :(得分:2)

您的方法签名说:

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);