2013-07-26 71 views
0

可以說我有以下的數據庫模型: Database model遍歷一個列表,其中包含一個自引用列表

在這段代碼看起來是這樣的:

ButtonCategories

public class ButtonCategory 
{ 
    public ButtonCategory() 
    { 
     this.Buttons = new HashSet<Button>(); 
     this.SubCategories = new HashSet<ButtonCategory>(); 
    } 

    [Key] 
    public int Id { get; set; } 

    [Required] 
    public string Description { get; set; } 

    public int? ParentCategoryId { get; set; } 

    [ForeignKey("ParentCategoryId")] 
    public virtual ButtonCategory ParentCategory { get; set; } 

    public virtual ICollection<ButtonCategory> SubCategories { get; set; } 

    public virtual ICollection<Button> Buttons { get; set; } 
} 

按鈕

public class Button 
{ 
    [Key] 
    public int Id { get; set; } 

    public int? ButtonCategoryId { get; set; } 

    [ForeignKey("ButtonCategoryId")] 
    public virtual ButtonCategory ButtonCategory { get; set; } 
} 

正如你所看到的,我的ButtonCategories有一個自引用列表。

所發生的問題是,我想所有ButtonCategories轉換爲另一種類型,讓我們說ButtonCategoriesMock。我想對列表中的所有按鈕也這樣做。 這樣做的問題是,我不知道,也不知道有多少個子級別。可能只有一個子類別,但它也是子類別子類別的子類別,...等等。

Example

我怎麼能輕鬆地轉換所有ButtonCategory項目和按鈕項目爲另一種類型?

在此先感謝!

+0

什麼其他類型的? –

+0

如果你想平坦的輸出,試試這個:http://stackoverflow.com/questions/1938409/linq-how-to-convert-the-nested-hierarchical-object-to-flatten-object – Greg

回答

2

我不知道關於「易」,但你可以實現自己的遞歸擴展方法來做到這一點:

但是,我相信一個遍歷方法,並選擇可能會處理你的情況

public static IEnumerable<T> Traverse<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> fnRecurse) 
    { 
     foreach (T item in source) 
     { 
      yield return item; 

      IEnumerable<T> seqRecurse = fnRecurse(item); 

      if (seqRecurse != null) 
      { 
       foreach (T itemRecurse in Traverse(seqRecurse, fnRecurse)) 
       { 
        yield return itemRecurse; 
       } 
      } 

     } 
    } 

片段可在:LINQ and recursive functions

參見:

+0

這工作。非常感謝! – Loetn

相關問題