Asp.net
Web API Queryable - 如何應用 AutoMapper?
我有一個像這樣用 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(); }
有一個更好的解決方案。嘗試這個:
public virtual IQueryable<PersonDto> Get(ODataQueryOptions<Person> query) { var people = query.ApplyTo(uow.Person().GetAll()); return ConvertToDtos(people); }這將確保查詢在 Person 而不是 PersonDTO 上執行。如果您希望通過屬性而不是程式碼進行轉換,您仍然需要實現類似於您提出的操作過濾器。