У меня есть простой метод WebApi, подобный этому, с атрибутом запроса OData.
[Queryable]
public virtual IQueryable<PersonDto> Get()
{
return uow.Person().GetAll()); // Currently returns Person instead of PersonD
}
То, что я хочу сделать, - это преобразовать результат запроса из типа Person для ввода PersonDto с использованием AutoMapper, прежде чем WebAPI преобразует результат в JSON.
Кто-нибудь знает, как я могу это сделать? Я знаю, я мог бы применить Mapper.Map после вызова GetAll(), а затем преобразовать обратно в IQueryable, однако это приведет к тому, что вся таблица будет возвращена и отображена до применения фильтра OData (не хорошо!).
Похоже, что этот вопрос ASP.NET Web API возвращает запрашиваемые DTO? охватывает ту же проблему (см. второй ответ для лучшего ответа), где предложение для использования AutoMapper в конце цепочки с использованием специального MediaTypeFormatter, однако я не знаю, как это сделать на примере, который я видел.
Любая помощь будет с благодарностью принята!
- Дополнительная информация
Я посмотрел исходный код для 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();
}