我有一个像这样用 OData 可查询属性装饰的简单 WebApi 方法。
[Queryable]
public virtual IQueryable<PersonDto> Get()
{
return uow.Person().GetAll()); // Currently returns Person instead of PersonD
}
我想要做的是在 WebAPI 将结果转换为 JSON 之前,使用 AutoMapper 将查询结果从 Person 类型转换为 PersonDto 类型。
有人知道我该怎么做吗?我知道,我可以在 GetAll() 调用之后应用 Mapper.Map,然后再转换回 IQueryable,但这会导致在应用 OData 过滤器之前返回和映射整个表(不好!)。
看起来这个问题ASP.NET Web API 返回可查询的 DTO?涵盖了相同的问题(请参阅第二个响应以获得更好的答案),其中建议使用自定义 MediaTypeFormatter 在链的末尾使用 AutoMapper,但是根据我看到的示例,我不知道如何做到这一点。
任何帮助将不胜感激!
-- 更多信息
我查看了 IQueryable 的源代码,但不幸的是,我看不到任何为此目的使用代码的方法。我已经设法编写了一个看起来可以工作的附加过滤器,但它肯定不是优雅的。
public class PersonToPersonDtoConvertAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext)
{
HttpResponseMessage response = actionExecutedContext.Response;
if (response != null)
{
ObjectContent responseContent = response.Content as ObjectContent;
var query = (responseContent.Value as IQueryable<Student>).ToList();
response.Content = new ObjectContent<IEnumerable<StudentResource>>(query.ToList().Select(Mapper.Map<Person, PersonDto>), responseContent.Formatter);
}
}
}
然后我装饰了这个动作
[Queryable]
[PersonToPersonDtoConvert]
public IQueryable<Person> Get()
{
return uow.GetRepo<IRepository<Person>>().GetAll();
}