-1

こんにちは、私のデータベース構造は次のようなものです

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

4 に答える 4

2

これはあなたの質問に対する正確な答えではありませんが、

親子関係が必要な場合は、データベースに次のような自己関係が必要です。

ここに画像の説明を入力

そしてEFはこれを生成します:

ここに画像の説明を入力

PictureCategory1 と PictureCategory2 を使用すると、項目の子/親に簡単にアクセスできます。

于 2013-10-18T11:54:50.230 に答える
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>
    

    データベースの最新データ ここに画像の説明を入力

  • 于 2013-10-18T12:49:54.143 に答える
    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;
        }
    
    于 2013-10-18T12:23:34.873 に答える
    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;
        }
    
    于 2013-10-18T11:40:25.433 に答える