如何查询在C#中使用LinQ构建菜单

时间:2017-08-01 11:05:05

标签: c# sql linq

我有3个表,如下所示引用了ID列:

#Table 1 
DepID NAME 
1     Dep1
2     Dep2
3     Dep3

#Table 2
RoleID Name DepID 
11      A1   1
12      A2   2
13      A3   1
14      A4   3
15      A5   3

#Table 3
ID Name RoleID 
21 B1    11
23 B2    14
24 B3    11

输出

    菜单
  • DEP1
    • A1
      • B1
      • B3
    • A3
  • DEP2
    • A2
  • DEP3
    • A4
      • B2
    • A5

我尝试过使用foreach循环,下面是示例:

StringBuilder objstr = new StringBuilder();
List<Parant> objpmenu = new List<Parant>();
List<Child> objcmenu = new List<Child>();
List<NestedChild> objnmenu = new List<NestedChild>();
objpmenu = GetParantMenu();
objcmenu = GetChildMenu();
objnmenu = GetNestedChildMenu();                    
objstr.Append("<ul id=\"drop-nav\">");
foreach (MenuParant _pitem in objpmenu)
{
 objstr.Append("<li ><a  href='" + _pitem.Url + "'><span >" +_pitem.MenuName + "</span></a>");
 var childitem = objcmenu.Where(m => m.ParentId == _pitem.Id).ToList();
 if (childitem.Count > 0)
 {
  objstr.Append("<ul>");
  foreach (var _citem in childitem)
  {
   objstr.Append("<li ><a id='asubservice" + _citem.ChildId + "' href='" + _citem.ChildUrl + "'><span>" + _citem.ChildName + "</span></a></li>");
   var NestedChildItem = objnmenu.Where(s => s.ChildId == _citem.ChildId).ToList();
   if (NestedChildItem.Count > 0)
   {
   objstr.Append("<ul>");
   foreach (var _nitem in NestedChildItem)
   {
   objstr.Append("<li><a href='" + _nitem.NestedChildUrl + "'>" + _nitem.NestedChildName + "</a></li>");
   }
   objstr.Append("</ul>");
   }
  }
  objstr.Append("</ul>");
 }
 objstr.Append("</li>");
}
objstr.Append("</ul>");                   
divmenu.InnerHtml = objstr.ToString();

请帮我使用Linq生成包含HTML内容的菜单。 ThanQ in Advance

2 个答案:

答案 0 :(得分:0)

通常,如果你有一个n级层次结构,你将使用递归方法,如下面的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication71
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable("DepID") ;
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("NAME", typeof(string));
            dt.Columns.Add("PARENTID", typeof(int));

            dt.Rows.Add(new object[] { 1, "Dep1"});
            dt.Rows.Add(new object[] { 2, "Dep2"});
            dt.Rows.Add(new object[] { 3, "Dep3"});

            dt.Rows.Add(new object[] { 11, "A1", 1});
            dt.Rows.Add(new object[] { 12, "A2", 2});
            dt.Rows.Add(new object[] { 13, "A3", 1});
            dt.Rows.Add(new object[] { 14, "A4", 3});
            dt.Rows.Add(new object[] { 15, "A5", 3});

            dt.Rows.Add(new object[] { 21, "B1", 11});
            dt.Rows.Add(new object[] { 23, "B2", 14});
            dt.Rows.Add(new object[] { 24, "B3", 11});

            Node node = new Node();
            node.Load(dt);
        }
    }
    public class Node
    {
        public static Node root = new Node();

        public string name { get; set; }
        public int? id { get; set; }
        public List<Node> children { get; set; }

        public void Load(DataTable dt)
        {
            LoadRecursive(dt, null, root);
        }
        public void LoadRecursive(DataTable dt, int? parent, Node node)
        {
            foreach (DataRow row in dt.AsEnumerable().Where(x => x.Field<int?>("PARENTID") == parent))
            {
                if (node.children == null) node.children = new List<Node>();
                Node newChild = new Node();
                node.children.Add(newChild);
                newChild.name = row.Field<string>("NAME");
                newChild.id  = row.Field<int>("ID");
                LoadRecursive(dt, newChild.id, newChild);
            }
        }
    }

}

答案 1 :(得分:0)

首先应该摆脱字符串连接。我们有几个框架来处理血腥细节。其中之一就是ASP.Net。

完成后,使用Repeater控件生成标记。了解asp.net中的databinding并使用它来生成菜单,而不是手动循环遍历所有数据。

如果您需要帮助生成我所讨论的Repeater控件,我们非常乐意为您提供更多指导。