2012-10-25 22 views
0

我有以下的數據庫設計的菜單項表如何爲單個數據庫表設計n級對象?

Id PId  MenuLink 
--- ---  --------- 
1  Null  Home.aspx 
2  Null  Admin.aspx 
3  Null  Logout.aspx 
4  2  Manage Content.aspx 
5  2  Manage Users.aspx 
6  2  Manage Storage.aspx 
7  4  Review Content.aspx 
8  4  Add New Content.aspx 
9  8  Articles.aspx 
10  8  News.aspx 

這n個電平分級菜單,根項具有的Pid無&其餘有他們的父母的ID。現在我有一張用於此表的Business對象。

public class myMenuItem 
{ 
    public int Id {get; set;} 
    public int PId {get; set;} 
    public string MenuLink {get; set;} 
} 

我要來填充,使得每個菜單項BO將包含父&所有其子項(n級)

目前我第一次拿到根項目的方式我busienss對象,然後填充每個一個一個地與我單獨創建的一個單獨的業務對象(複製)。有沒有更好的方式來完成這項任務(因爲我的桌子是單一的)?

public class myMenuItem 
{ 
    public int Id {get; set;} 
    public int PId {get; set;} 
    public string MenuLink {get; set;} 
    public List<level1> Level1Items {get ; set;} 
    public List<level2> Level2Items {get ; set;} 
} 

// Duplicate class 
public class level1 
    { 
     public int Id {get; set;} 
     public int PId {get; set;} 
     public string MenuLink {get; set;} 
     // Manually create another list 
    } 

回答

4

「遞歸」是你在這裏尋找的詞。我想,不要爲每個級別製作課程,而只需要myMenuItem。我也會假設level1level2沒有任何意義,他們只是爲了唯一性而命名。例如,除了您的兩個列表(Level1ItemsLevel2Items)應替換爲List<MenuItem> ChildItems之外,您的myMenuItem與此處的示例一樣正常。

爲了使用SO着色的可讀性,我決定將myMenuItem重命名爲MyMenuItem

你也許可以做這樣的事情

List<MyMenuItem> MenuItems = <list of your menu items, to save db calls> 

List<MyMenuItem> GetMenu() 
{ 
    return MenuItems.Where(f => f.PId == null).Select(GetItem).ToList(); 
} 

MyMenuItem GetItem(MyMenuItem myMenuItem) 
{ 
    var immidiateChildren = MenuItems.Where(m => m.PId == myMenuItem.Id); 
    if (immidiateChildren.Any()) 
     myMenuItem.ChildItems = immidiateChildren.Select(GetItem).ToList(); 
    return myMenuItem; 
} 

你可能從已在此擴大實例沿途MyMenuItem,而不是做你建立樹形結構之前受益。

+0

非常感謝.....什麼是ChildItems?這是BO內的財產清單? –

+0

是@DamienJoe。它應該替換你的兩個列表,即「Level1Items」和「Level2Items」。 – Heki