LINQ to Entity Framework Проблем с много-много нетърпеливо зареждане

Имам следното запитване:

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“ е търсене много към много между „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;

person JasonRShaver    schedule 01.06.2009    source източник


Отговори (2)


Ранните включвания често се губят при някои видове заявки (т.е. с допълнителни присъединявания и т.н.)

Начинът да заобиколите това е да направите заявката (и след това, докато връщате обекти, т.е. изберете 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 – Как да направите Include наистина Include

Алекс

person Alex James    schedule 02.06.2009
comment
Просто се чудя, не е ли смисълът от ранното включване да се добави някакъв вид функционалност към този обект в самата заявка? Например, ако искате да включите (Производители) и то да го включи в клаузата where, ако искате да получите списък със свързани производители, намерени в Ню Йорк например. - person sksallaj; 13.02.2014

Опитвали ли сте да се присъедините вместо това?

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;
person bytebender    schedule 01.06.2009