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 级)

目前,我首先获取 Root 项目,然后使用我单独创建的单独业务对象(复制)逐个填充每个级别。有没有更好的方法来完成这项任务(因为我的桌子是单人的)?

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

“递归”是您在这里寻找的词。myMenuItem我假设你只需要 ,而不是为每个级别制作课程。我还将假设 and 没有任何意义level1level2它们只是为了唯一性而被这样命名。

因此,myMenuItem对于此处的示例,您的情况很好,除了您的两个列表 (Level1ItemsLevel2Items) 应替换为List<MenuItem> ChildItems, 例如。

为了 SO 着色的可读性,我决定重命名myMenuItemMyMenuItem.

你可能会做这样的事情

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 回答