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);
您的方法签名显示:
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);