0

menuItem テーブルの次のデータベース設計があります

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 Nil があり、残りの項目には親 ID があります。これで、このテーブルのビジネス オブジェクトができました。

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

各 MenuItem BO に親アイテムとそのすべての子アイテム (n レベル) が含まれるように、busienss オブジェクトを設定したい

現在、最初にルート項目を取得してから、個別に作成した個別のビジネス オブジェクト (複製) を各レベルに 1 つずつ入力します。このタスクを実行するためのより良い方法はありますか (私のテーブルは単一であるため) ?

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

1 に答える 1

4

「再帰的」はあなたがここで探している言葉です。レベルごとにクラスを作成するのではなく、、だけが必要だと思いますmyMenuItemlevel1また、とには意味がなく、独自性のためにそのように名前が付けられていると仮定しlevel2ます。

したがって、ここでの例では、2つのリスト(および)をたとえばに置き換える必要があることmyMenuItemを除いて、そのままで問題ありません。Level1ItemsLevel2ItemsList<MenuItem> ChildItems

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ツリー構造を構築する前にインスタンス化するのではなく、これを拡張して途中でインスタンス化することで、おそらくメリットが得られます。

于 2012-10-25T07:20:39.213 に答える