LINQ to Entity Framework Много-много проблем с загрузкой

2

У меня есть следующий запрос:

var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers")
              where e.Customers.ID == customer.ID
              select e;

И все работает, я получаю свое оборудование, и он загружает таблицу Производителей правильно (с нетерпением). Но когда я пытаюсь выполнить следующий запрос many-to-many:

var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers")
              where e.Customers.ID == customer.ID
              from cce in e.ContractEquipments
              where cce.Contracts.EndedOn >= DateTime.Today
              select e;

где "ContractEquipments" - это многозначный поиск между "Equipments" и "Contracts", но когда этот запрос выполняется, таблица "Производители" больше не загружается. Любая идея, как исправить это, не делая следующее:

if (MyEntity.Manufacturers.IsLoaded == false) 
   MyEntity.ManufacturersReference.Load()

В этом проекте выполняется несколько часов, и я хочу, чтобы количество обращений к базе данных было меньше.

ИЗМЕНИТЬ № 1:

Я также пробовал это без успеха:

var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers")
              where e.Customers.ID == customer.ID
              join cce in ContractContext.ContractEquipments 
                on e.ID equals cce.Equipments.ID
              where cce.Contracts.EndedOn >= DateTime.Today
              select e;
Теги:
linq
entity-framework
eager-loading

2 ответа

7
Лучший ответ

Раньше часто заблуждаются в некоторых типах запросов (т.е. с дополнительными объединениями и т.д.)

Чтобы обойти это, нужно выполнить запрос (и затем, пока вы возвращаете объекты, т.е. выбираете e, а не проекцию, то есть выберите новый {...}), который вы можете применить к ObjectQuery, и включить вокруг снаружи:

var MyQuery = ((from e in ContractContext.Equipments
              where e.Customers.ID == customer.ID
              from cce in e.ContractEquipments
              where cce.Contracts.EndedOn >= DateTime.Today
              select e) as ObjectQuery<Equipment>).Include("Manufacturers");

Это должно работать.

Если вас интересует более подробная информация об этом, ознакомьтесь с Совет 22 - Как включить Включить действительно Включить

Алекс

  • 0
    Спасибо, чувак, работал как шарм.
  • 0
    Просто интересно, не стоит ли включать раннее включение, чтобы добавить какую-то функциональность к этому объекту в самом запросе? Например, если вы хотите включить («Производители») и включить его в предложение where, если вы хотите получить список связанных производителей, найденных, например, в Нью-Йорке.
0

Попробовали ли вы присоединиться к этому?

var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers")
              where e.Customers.ID == customer.ID
              join cce in e.ContractEquipments on e.Id equals cce.EquipmentId
              where cce.Contracts.EndedOn >= DateTime.Today
              select e;
  • 0
    Я просто попробовал это, и это не сработало. Смотрите правку №1 выше.
  • 0
    Что это возвращает?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню