2017-09-12 41 views
0

的所有兒童嘿,我有以下類:負荷實體

public class Tree 
{ 
    public int Id { get; set; } 
    public Tree Parent { get; set; } 
    public ICollection Chidren { get; set; } 
} 

我想獲得所有相關實體。

我的樹結構如下所示:

- Root (id 1) 
    -- Cat1 (id 2) 
    --SubCat 1 (id 4) 
    --SubCat 2 (id 5) 
    -- Cat2 (id 3) 

如果我嘗試使用讓所有的實體:

_context.Entity.FirstOrDefault(x => x.Id == 1) 
       .Include(x => x.Children) 

它gaves我的根,CAT1和CAT2(兒童),但CAT1和Cat2兒童失蹤。 是否有可能獲得所有相關的實體,從根實體開始,到「兒童的孩子」?

+0

檢查一些答案在這裏:https://stackoverflow.com/questions/24022957/entity-framework-how-to-disable-lazy-loading-for-specific-query – Ric

+0

可能重複的[實現遞歸屬性加載在EF核心](https://stackoverflow.com/questions/40987365/implementing-recursive-property-loading-in-ef-core) –

+0

如果這是整個樹,您可以採用從https:// stackoverflow解決方案.COM /問題/ 46160780 /地圖類父-ID自參照表結構到EF-核心實體/ 46161259#46161259。類似於'_context.Entity.Include(x => x.Children).ToList()。FirstOrDefault(x => x.Parent == null);' –

回答

0

好吧,我明白了。

像在這裏說明一下:Understanding .AsEnumerable() in LINQ to SQL

AsEnumerable()和ToList()發送SQL查詢數據庫。所以你使用SQL端加載所有的子對象的數據,然後在代碼端過濾ID。

如果在SQL查詢做FirstOrDefault(),你只會得到誰擁有ID = 1和他的第一個孩子的樹。

您可以使用:

var tree = _context.Trees 
     .Include(x => x.Children) 
     .AsEnumerable() 
     .FirstOrDefault(x => x.Id == 1); 

但要小心,也許你正在裝載這麼多DATAS,它可以是非常沉重和緩慢,依賴於數據庫的大小。

否則,您可以在2次,第一次排名第一的元素加載,然後他的孩子。