Используя Automapper, вам не нужно беспокоиться о ленивых нагрузках:
public List<ShipmentOrderViewModel> GetShipmentOrder()
{
var query= context.shipmentOrders.AsQueryable();
return query.ProjectTo<ShipmentOrderViewModel>().ToList();
}
ProjectTo
занимает IQueryable
(с чем обычно обращаются EF-запросы, хотя в этом случае, потому что вы используетеfull DbSet
, нам нужно AsQueryable()
), и мы спроецируем в него запрос, чтобы загрузить только данные, необходимые для вашей модели представления.Это приведет к оптимизированному запросу к базе данных, чтобы загрузить все поля, необходимые для заполнения списка моделей представлений.
Несколько запахов из исходного кода:
Очевидно, что с ростом системынужно ограничить количество записей, что это будет отозвать.Простой возврат всего в DbSet
быстро станет большой проблемой по мере увеличения числа записей.
Я уточнил наименование возвращаемого объекта в качестве модели представления, чтобы гарантировать его отличие от класса Entity.,В некоторых случаях модель представления может в значительной степени отображать поля 1-в-1 с сущностью, но передача сущностей за пределы области действия DbContext
изобилует проблемами, и даже двойное назначение сущности путем выбора новой, отсоединеннойкопировать и рассматривать его как модель представления не рекомендуется.(Класс сущностей всегда должен рассматриваться как сущность, в будущем это может сбить с толку, если сущности могут быть отсоединены от присоединенных или неполных представлений данных.)
Наконец, почему вы закрываете соединение с базой данных?в контексте явно?Как определяется контекст?Если вы используете контейнер IoC, такой как Autofac, Unity, Ninject и т. Д., Это должно управляться автоматически по мере удаления контекста.При условии, что контекст ограничен запросом.Если нет, то где строится контекст?Если необходимо закрыть соединение, контекст следует ограничить с помощью блока using (), пока вы не сможете реализовать контейнер IoC для управления его временем жизни.