私はASP.NET Web APIを使って素敵なAPIを構築しましたが、私のコンテキスト(エンティティフレームワーク)AsQueryableからエンティティを返すのは適切ではないと思いますので、すべてをDTOオブジェクトにマッピングしています。ASP.NET Web APIはクエリ可能なDTOを返しますか?
しかし、わかりませんが、私は自分のコンテキストをクエリ可能に保つことができますが、エンティティの代わりにDTOだけを返すことはできますか?またはこれは不可能ですか?
これは私のコードです:
public IQueryable<ItemDto> Get()
{
using (EfContext context = new EfContext())
{
Mapper.CreateMap<Item, ItemDto>()
.ForMember(itemDto => itemDto.Category, mce => mce.MapFrom(item => item.Category.Name));
IEnumerable<ItemDto> data = Mapper.Map<IEnumerable<Item>, IEnumerable<ItemDto>>(context.Items
.OrderByDescending(x => x.PubDate)
.Take(20));
return data.AsQueryable();
}
}
あなたは、私がデータをロード見て、その少しのIEnumerableコレクション照会可能を作ることができたよう。問題は、このコードに対して生成されたクエリは、最初にすべてのアイテム(または少なくとも20個の最初のアイテム)をロードしてから出力をフィルタするため、おそらく非常に非効率的なことです。
私は私の問題をできるだけ良く説明してほしいと思いますが、説明するのは少し難しいです。私はGoogle上でそれについて何も見つけることができませんでした。
Web APIエンドポイントをIQueryableとして公開しないでください。本当に必要な場合は、Web API ODataを参照してください。それ以外の場合は、単純な古いRESTエンドポイントに固執し、コントローラアクションのパラメータとしてあらゆる種類のフィルタリングを可能にします。 – mare