【发布时间】:2012-04-11 06:28:10
【问题描述】:
我使用 ASP.NET Web API 构建了一个不错的小 API,但我想从我的上下文(实体框架)AsQueryable 返回实体是不正确的,所以我将所有内容都映射到 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 端点,并在控制器操作上公开任何可能的过滤作为参数。
标签: asp.net linq entity-framework asp.net-web-api