2009-06-01 85 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