我有一个简单的WebApi方法像这样装饰了OData可查询属性。
[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 return queryable DTOs?涵盖了相同的问题(请参阅第二个回应来获得更好的答案),其中建议是使用自定义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(); }