如何为后续数据编写递归方法

时间:2013-10-18 11:29:49

标签: c# asp.net recursion

我的数据库结构就像

Id  ParentId    MenuName    URL
1   0           Home            google.com
2   1           Privacy         yahoo.com
3   0           About Us    gmail.com
4   0           Contact US  www.contactus.com
5   2           Disclaimer  www.disclaimer.com
6   4           FeedBack    www.feedback.com
7   3           What we do  www.whatwedo.com
8   3           How we do   www.howWeDo.com

我想根据parentid获取数据。主要问题是数据可以是N级深度。需要在C#或LINQ

中使用解决方案

由于

到目前为止尝试过:

 public string getMenuItems(int parentId)
{

    using (dynamicMenuEntities context = new dynamicMenuEntities())
    {
        var menuObj = from r in context.Menus
                      where r.ParentId == parentId
                      select new { r.MenuName, r.URL, r.Id };


        foreach (var obj in menuObj)
        {
            sbMenu.Append("<li><a target=\"_blank\" href='" + Page.ResolveUrl(obj.URL) + "'>" + obj.MenuName + "</a></li>");
            int childCount = context.Menus.Count(ch => ch.ParentId == obj.Id);
            if (childCount > 0)
            {
                return getMenuItems(obj.Id);
            }
        }
        return sbMenu.ToString();


    }

4 个答案:

答案 0 :(得分:2)

这不是你问题的确切答案,但是:

如果您想要父/子关系,在数据库中您必须拥有这样的自我关系:

enter image description here

EF会产生这个:

enter image description here

使用PictureCategory1和PictureCategory2,您可以轻松访问项目的子项/父项。

答案 1 :(得分:0)

假设您的实现中有一个名为MenuItem的实体,并且您正在使用实体框架。然后,

    List<MenuItem> GetMenuItemsByParentId(int parentId)
    {
    EntityContext newContext = new EntityContext();
    List<MenuItem> getMenuItems = newContext.MenuItems.Where(c => c.ParentId == parentId).ToList();
    newContext.Dispose();
    return getMenuItems;
    }

答案 2 :(得分:0)

我在记事本中写这个,我不测试它,但你可以这样想: (也可以使用StringBuilder而不是字符串)

public string getMenuItems(int parentId)
{
    using (dynamicMenuEntities context = new dynamicMenuEntities())
    {
        string tags = new string();
        tags += "<ul>";

        var menuObj = from r in context.Menus
                      where r.ParentId == parentId
                      select new { r.MenuName, r.URL, r.Id };


        foreach (var obj in menuObj)
        {
            tags += "<li>";

            int childCount = context.Menus.Count(ch => ch.ParentId == obj.Id);
            if (childCount > 0)
            {
                tags += obj.MenuName;
                tags += getMenuItems(obj.Id);
            }
            else
            {
                tags += "<a target=\"_blank\" href='" + Page.ResolveUrl(obj.URL) + "'>" + obj.MenuName + "</a>";
            }

            tags += "</li>"
        }

        tags += "</ul>";

        return tags;
    }

答案 3 :(得分:0)

我差不多完成了。正在搜索第n级唯一存在的问题是

  • 标签的定位。

     public string getMenuItems(int parentId)
    {
        using (dynamicMenuEntities context = new dynamicMenuEntities())
        {
            var menuObj = from r in context.Menus
                          where r.ParentId == parentId
                          select new { r.MenuName, r.URL, r.Id };
            foreach (var obj in menuObj)
            {
                sbMenu.Append("<li><a target=\"_blank\" href='" + Page.ResolveUrl(obj.URL) + "'>" + obj.MenuName + "</a>");
                childCount = context.Menus.Count(r => r.ParentId == obj.Id);
                if (childCount > 0)
                {
                    sbMenu.Append("<ul>");
                    getMenuItems(obj.Id);
                }
                else
                {
                    sbMenu.Append("</ul>");
                }
    
            }
    
        }
        return sbMenu.ToString();
    }
    

    HTML输出(问题与我们联系)

    <ul id="menu"><li><a target="_blank" href='/Dynamic-HTML-Menu/www.home.com'>Home</a><ul><li><a target="_blank" href='/Dynamic-HTML-Menu/www.k.com'>Know about us</a></ul><li><a target="_blank" href='/Dynamic-HTML-Menu/www.about.com'>About</a><ul><li><a target="_blank" href='/Dynamic-HTML-Menu/www.whoweare.com'>Who we are</a></ul><li><a target="_blank" href='/Dynamic-HTML-Menu/www.contactus.com'>Contact US</a><ul><li><a target="_blank" href='/Dynamic-HTML-Menu/www.feedback.com'>FeedBack</a><ul><li><a target="_blank" href='/Dynamic-HTML-Menu/www.HellYa.com'>FeedBack2</a><ul><li><a target="_blank" href='/Dynamic-HTML-Menu/www.FeedBack3.com'>FeedBack3</a></ul><li><a target="_blank" href='/Dynamic-HTML-Menu/www.Contactus2.com'>Contact Us2</a></ul> </ul>
    

    数据库中的最新数据 enter image description here