2012-04-16 50 views
0

我有下面的代碼與我試圖使用EF建立一個分層/父子關係模型的層次結構樹:如何建立使用EF和LINQ

ICollection<Content> contentList = _dbset.Where(
       content => 
       content.CompanyId == companyId && content.ParentContentId == null && content.Deleted == false) 
       .OrderBy(content => content.SortLevel) 
       .Include(content => content.SubContent.Select(childContent => childContent.SubContent)).ToList(); 

我怎樣才能建立一個父 - 在這種情況下使用EF的子樹?

回答

1

由於EF跟蹤加載到數據庫上下文中的所有對象,除非跟蹤關閉你可以加載所有記錄的實際查詢您需要將樹建立到上下文中,然後在先前的結果集/集合上編寫一個linq查詢,以通過在查詢上指定父ID來過濾所有child-> grandchild記錄。例如

ICollection<object> treeList = <dbcontent>.<entity>.All().ToList(); 
treeList = treeList.Where(o => o.ParentId == 0).ToList(); 
0

因此,你基本上有n個孩子有更多的孩子?如果你也不會有其中很多,爲什麼不只是有一個遞歸函數?

我問你是否沒有的原因其中很多,如果最終遞歸足夠多的次數,你可能會得到一個異常。但是...需要很多深度。

+0

正確。我可以寫一個遞歸函數,但我沒有一定數量的孩子,這是我最關心的問題。 – 2012-04-16 08:45:35

+0

即便如此,除非你碰到幾千個孩子,否則我不會爲此擔心。 – NeroS 2012-04-18 05:49:40

0

也許你可以通過一個固定點經營者給一個嘗試遞歸操作:

// static fixpoint operator (highly reusable) 
public static Action<T> ActionFix<T>(Func<Action<T>, Action<T>> f) 
{ 
    return t => f(ActionFix(f))(t); 
} 

// your recursive ordering 
foreach (var parentContent in contentList) 
{ 

    ActionFix<Content>(
    actionContent => 
      content => 
       { 
       // ordering on the subContent of the node 
       content.SubContent = content.SubContent.OrderBy(sc => sc.SortLevel).ToList(); 
       // recursive ordering on each element on the subContent 
       content.SubContent.ToList().ForEach(actionContent); 
       }) 
    (parentContent); 
}