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を返しますか? 同じ問題をカバーしています (より良い回答については、2 番目の回答を参照してください)。提案は、カスタム 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();
}