2015-06-26 29 views
1

我有以下方法:LINQ ToList()抛出误差上异步方法

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(),它抛出一个错误:

Since System.Func<XXX.Framework.Persistence.IAsyncRepository<Entity>,System.Threading.Tasks.Task> is an async method that returns Task , a return keyword must not be followed by an object expression.

Did you intend to 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); 

回答

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