如何查询以在 C# 中使用 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

输出

    菜单
  • 出发1
    • A1
      • B1
      • B3
    • 答3
  • 出发2
    • A2
  • Dep3
    • A4
      • B2
    • 答5

我尝试使用 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 内容的菜单。 提前感谢Q

通常,在具有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);
}
}
}
}

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

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

如果您需要帮助生成我所说的那些中继器控件,我将非常乐意为您提供进一步的指导。

最新更新