Я создал симпатичный маленький API с помощью ASP.NET Web 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.