LINQ to Entity Framework Много-много проблем с загрузкой - PullRequest
2 голосов
/ 02 июня 2009

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

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

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

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" - это поиск "многие ко многим" между "Оборудованием" и "Контрактами", но когда этот запрос выполняется, таблица Производители больше не загружается легко. Любая идея, как это исправить, не делая следующее:

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;

Ответы [ 2 ]

7 голосов
/ 02 июня 2009

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

Чтобы обойти это, нужно выполнить запрос (и тогда, пока вы возвращаете сущности, т.е. выберите 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 - Как сделать так, чтобы действительно включить Включить

Alex

0 голосов
/ 02 июня 2009

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

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;
...