2009-09-11 38 views
9

我有一個標準的自引用表Categories。在我的實體模型中,我建立了關聯ChildrenParent。是否有可能加載整個Category對象沒有延遲加載?急於加載自引用表

如果我使用下面的代碼,它只加載到第二級。

db.Categories.MergeOption = System.Data.Objects.MergeOption.NoTracking; 

var query = from c in db.Categories.Include("Children") 
      where c.IsVisible == true 
      orderby c.SortOrder, c.Id 
      select c; 

如果我已經加載了所有類別對象,是否可以加載引用?

一種方法加載它是多次

db.Categories.Include("Children.Children.Children.Children.Children") 

添加Children屬性,但它產生的很長瘋了的T-SQL代碼,也不會做我想做的。

回答

1

不,這是不可能的。考慮:所有LINQ to Entities查詢都被翻譯成SQL。哪個SQL語句在自引用層次結構中包含無限深度?在標準的SQL中,沒有一個。如果在T-SQL中有這樣的擴展,我不知道它是什麼,我也不認爲EF提供者也這麼做。我已經習慣了實現,如果我有幾個實體我想在自引用表中的所有兒童

+1

但是,如果我運行查詢「選擇*從類別」我已經加載整個表,並且我已經加載所有父和子類別,因爲它們都在一個表中。那麼在這種情況下,將這些加載的記錄分配給引用的屬性並不是很複雜? – 2009-09-14 17:30:57

+1

如果您實際上迭代了整個表格,則所有對象*將*放在內存中,並且*會*已經被修正,無論是否包含。但是直到你達到表中的最後一個記錄爲止,這是不會發生的。包含相關對象將保留在您迭代的* first *記錄中。 – 2009-09-14 18:13:55

+3

「哪個SQL語句在自引用層次結構中包含無限深度?」 - > T-SQL中的公用表表達式 – 2011-03-04 09:06:05

1

好的,你可以考慮使用Load方法。

if (!category.Children.IsLoaded) 
     category.Children.Load(); 

當然,類實體需要通過ObjectContext進行跟蹤。

這裏有更好的解釋how-does-entity-framework-work-with-recursive-hierarchies-include-seems-not-to

+0

我知道這種方法(它會產生T-SQL查詢的問題),但我也無法加載它,因爲我將它保存到緩存中。我正在尋找別的東西。如果我加載整個類別表,我也加載父母和子類別,但關聯屬性不加載。此外,我有CategoryType的相關表,我麻煩加載它爲每個類別,無論他們引用同一行... – 2009-09-14 08:26:27

+0

好吧,我沒有看到你必須緩存它。嗯,我會試着去思考如何解決這個問題。 – 2009-09-14 08:54:51