我有以下方法:
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);
答案 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);