我用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 2014-06-01 16:20:50