Сократите время загрузки с помощью Entity Framework и отложенной загрузки - PullRequest
0 голосов
/ 06 декабря 2018

C # WinForms: я использую кодовый подход с Entity Framework v6.2.0 и отложенная загрузка , проблема в том, что это занимает от 4 до 5 секунд (только в первый раз) для загрузки данных в нашу сетку .Я хотел бы сократить это время загрузки.Любая помощь?

public List<ShipmentOrder> GetShipmentOrder()
{    
    var ObjShipmentOrderResult = context.shipmentOrders.ToList();
    List<ShipmentOrderEntity> ObjShipmentOrder = null;

        if (ObjShipmentOrderResult != null)
        {
            ObjShipmentOrder = new List<ShipmentOrderEntity>();
            foreach (var item in ObjShipmentOrderResult)
            {
                context.Entry(item).Reference(e => e.storageGate).Load();
                context.Entry(item).Reference(e => e.shippingOrderStatus).Load();
                context.Entry(item).Reference(e => e.packingOrder).Load();
                ObjShipmentOrder.Add(item);
            }
            context.Database.Connection.Close();
            return AutoMapper.Mapper.Map<List<ShipmentOrder>>ObjShipmentOrder);
        }
        else
        {
            return null;
        }
}

1 Ответ

0 голосов
/ 07 декабря 2018

Используя 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 для управления его временем жизни.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...