2011-07-03 39 views
0

我有一個id和parentId列的表,嵌套級別只是1(現在)。
現在我加載項是這樣的:Linq到實體和分層表

using (KEntities ctx = new KEntities()) 
{ 
    ctx.KSet.MergeOption = MergeOption.NoTracking; 

    var items = (from c in ctx.KSet 
       where c.ParentId == 0 
       select new 
       { 
        Title = c.Title, 
        Id = c.Id,       
        Subs = ctx.KSet.Where(o => o.ParentId == c.Id)          
       }).ToList(); 

} 

,我可以選擇另一種選擇是設置在桌子上自我參照,所以實體會暴露自身的導航性能,然後我可以將負載( )加載孩子(延遲加載?)。

哪種方法是首選,爲什麼?

回答

0

恕我直言,我比較喜歡你所做的一切。我喜歡調用.ToList()原因,然後我知道那時候我有內存中的數據,並且不必擔心使用延遲加載可能會遇到的一些問題。

「通過延遲加載關聯泄漏對不同層的持久存儲訪問。」從link

0

採取 有效選項暴露導航屬性Children,並呼籲:

var items = ctx.KSet.Include("Children").Where(c => c.ParentId == 0); 

這將允許您直接與KSet實體工作。投影將創建一個新類型。在暴露導航屬性的情況下,您還可以選擇使用加載(如示例中所示)或顯式/延遲加載(如果需要)。只有在想要過濾或分類兒童時,投影纔有意義。

+0

所以我想返回一個不同類型的孩子(添加一些自定義屬性,如計數或類似)我應該留在我上面寫的東西?關於包含(「兒童」)的 – anderi

+0

。我沒有孩子實體!它是同一個實體! – anderi

+0

那麼,如果你需要任何特殊的計算/未映射的領域,你需要一個投影,在這種情況下,什麼更好的問題沒有意義,因爲你只有一個選項。 「兒童」不是一個實體,它是包含其子女名單的實體的導航屬性。 –