2009-06-01 86 views
2

我有以下查询:LINQ到实体框架多对多的预先加载的问题

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; 

回答

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"); 

这应该工作。

如果你有兴趣在这方面的更多信息,请Tip 22 - How to make Include really Include

亚历

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。 – JasonRShaver 2009-06-01 21:29:28

+0

它返回什么? – bytebender 2009-06-01 22:04:40