2010-07-06 40 views
8

我有了這個非常基本的表結構:LINQ到實體 - 使用包括預先加載()

dbo.tblCategory
dbo.tblQuestion(多對一關係tblCategory)
dbo.tblAnswer (與tblQuestion多對一的關係)

所以基本上,我想要做的是當我加載一個類別,我也想加載所有的問題和所有的答案。現在

,我已經能夠做到這一點使用下面的代碼:

public tblCategory Retrieve(int id) 
{ 
    using (var entities = Context) 
    { 
     var dto = 
      (from t in entities.tblCategory.Include("tblQuestion") 
              .Include("tblQuestion.tblAnswers")  
       where t.Id == id 
       select t).FirstOrDefault(); 

      return entities.DetachObjectGraph(dto); 
     } 
    } 
} 

不過,我不是這個完全迷戀;如果關係名稱在我的模型中更改;構建項目時我不會遇到錯誤。理想情況下,我想使用lambda表達式;像這樣:

public tblCategory Retrieve(int id) 
{ 
    using (var entities = Context) 
    { 
     var dto = 
      (from t in entities.tblCategory.Include(t => t.tblQuestion) 
      where t.Id == id 
      select t).FirstOrDefault(); 

     return entities.DetachObjectGraph(dto); 
    } 
} 

現在,用上面的代碼片段;我被困在如何深入到答案表。任何想法我可以使用這個lambda表達式?

+0

Linq to .NET 4.0中的實體確實支持延遲加載(默認情況下啓用),據我所知。那麼你不需要爲此煩惱。 =) – Jens 2010-07-06 12:11:36

+0

假設我們在4.0。我們目前仍然使用3.5 =) – 2010-07-06 12:14:00

+0

[Entity Framework .Include()with compile time checking?](http://stackoverflow.com/questions/2921119/entity-framework-include-with-編譯時檢查) – 2010-07-06 12:55:26

回答

7

OK;我能夠得到這個工作,從here一些幫助。

基本上,我需要這樣做:

public tblCategory Retrieve(int id) 
{ 
    using (var entities = Context) 
    { 
     var dto = 
      (from t in entities.tblCategory.Include(t => t.tblQuestion) 
              .Include(t => t.tblQuestion.First().tblAnswer) 
      where t.Id == id 
      select t).FirstOrDefault(); 

     return entities.DetachObjectGraph(dto); 
    } 
} 

從上面的鏈接,我只能提領的問題,收集的各個項目tblAnswers。在這裏,我選擇了對集合的第一項取消引用tblAnswers。實際上,這個lambda表達式僅用於產生屬性路徑「tblQuestion.tblAnswers」,它將急切加載所有問題的答案。

所以,即使看起來我只是拉第一個問題的答案,我實際上是拉所有問題的所有答案。

+6

如果你不能在lambda表達式中使用'Include()',請添加'using System.Data.Entity;'。 ([src](http://stackoverflow.com/a/21005478/1937994)) – gronostaj 2014-11-16 22:22:56

+0

或者:'using Microsoft.Data.Entity;' – 2016-05-13 09:52:49