LINQ后台递归生成无限级树

第一次发贴,写的不好见谅!!!!

以前在生成导航菜单时经常需要直接从后台追加出一个用div生成的HTML的树形结构,但C#因为直接有TreeView控件而很少有从后台追加的,今天写了一个简单的后台生成的树。

  其实所谓的无限级树形菜单生成就是在遍历时不断的跟据父节点ID在这个集合中查找它的parentId进行比较。

这里生成的比较简单,并且JS动态折叠也没有做,刚学LINQ TO SQL把自己想做的东西做出来,肯定有不足的地方需要指正,以后慢慢修改吧!!

这里的dv只是页面上用来呈现树的一个层,这里就不再啰嗦了!

这里是数据库中的表(tbRule)结构(比较简单,但能说明问题我觉得就够了):

  

 
  
#region
public void GetTheTopMenu()
{
tbRule tr
= new tbRule();
RuleMenuDataContext rm
= new RuleMenuDataContext();
var parentMenu
= from rule in rm.tbRule select new { rule };
List
< tbRule > rulesList = GetChild();
int a = 0 ;
foreach (var rul in parentMenu)
{

if (rul.rule.childId == 0 )
{
this .dv.InnerHtml += " <div style=\ " padding - left: " + 10 * a + " px;border:solid 1px black;\ " id=\ " N_ " + rul.rule.id + " \ " οnclick=\ " ShowChildDiv( ' N_" + rul.rule.id + "1 ' )\ " > " + rul.rule.ruleName + " </div><br /><div id=N_ " + rul.rule.id + " 1> " ;
ShowChildNode(rul.rule.id, rulesList);
this .dv.InnerHtml += " </div> " ;
}
}
}
/// <summary>
/// 显示子节点信息,根据parentId不断地在ruleList中进行查找子项
/// </summary>
/// <param name="parentId"></param>
/// <param name="ruleList"></param>
// 这里的a是用来在子项中控制它与浏览器左边的位置。
int a = 0 ;
public void ShowChildNode( int parentId, List < tbRule > ruleList)
{

a
++ ;
var rule
= from rules in ruleList where rules.childId == parentId select rules;
foreach (tbRule r in rule)
{
a
++ ;
this .dv.InnerHtml += " <div style=\ " padding - left: " + 10 * a + " px;border:solid 1px black;\ " id=\ " N_ " + r.id + " \ " οnclick=\ " ShowChildDiv( ' N_"+r.id+"1 ' )\ " > " + r.ruleName + " </div><br /><div id=N_ " + r.id + " 1> " ;
ShowChildNode(r.id, ruleList);
this .dv.InnerHtml += " </div> " ;
}
}
#endregion
#region Convert ToList
public static List < tbRule > GetChild()
{
RuleMenuDataContext rm
= new RuleMenuDataContext ();
var q
= rm.tbRule;
return q.ToList();
}
#endregion

 

上次没有好好完善,这次把它完善后放上来的,树节点全部是用div做的,是一次性加载出的所有的节点信息,有需要可以直接更改!!!!!

转载于:https://www.cnblogs.com/netDream/archive/2010/05/04/LINQ_DIv.html

LINQ(Language Integrated Query)是C#语言中的一种功能强大的数据查询技术,它可以用于各种数据源,如XML、数据库、对象集合等。LINQ提供了一种统一的查询语法,使得我们可以通过类似SQL的语法来查询不同的数据源。 递归是一种常见的算法技术,它可以用于解决许多复杂的问题。在LINQ中,我们也可以使用递归来查询数据。例如,我们可以使用递归来查询一个树形结构的数据。下面是一个简单的示例: ``` public class Node { public int Id { get; set; } public string Name { get; set; } public List<Node> Children { get; set; } } public static IEnumerable<Node> Traverse(Node node) { yield return node; if (node.Children != null) { foreach (var child in node.Children) { foreach (var subChild in Traverse(child)) { yield return subChild; } } } } ``` 在上面的示例中,我们定义了一个Node类来表示树形结构的节点,其中包含一个Id、一个Name和一个Children属性。我们还定义了一个Traverse方法,该方法使用递归来遍历整个树形结构,并返回一个IEnumerable<Node>类型的结果。 在Traverse方法中,我们首先使用yield return关键字返回当前节点,然后使用foreach语句遍历当前节点的所有子节点,并使用递归调用Traverse方法来遍历子节点的子节点。最后,我们使用yield return关键字返回遍历的结果。 使用LINQ查询树形结构的数据时,我们可以使用Traverse方法来查询整个树形结构,例如: ``` var rootNode = new Node { Id = 1, Name = "Root", Children = new List<Node> { new Node { Id = 2, Name = "Child1", Children = new List<Node> { new Node { Id = 3, Name = "SubChild1", Children = new List<Node> { new Node { Id = 4, Name = "SubSubChild1", Children = null } } } } }, new Node { Id = 5, Name = "Child2", Children = new List<Node> { new Node { Id = 6, Name = "SubChild2", Children = null } } } } }; var result = from node in Traverse(rootNode) where node.Id % 2 == 0 select node; foreach (var node in result) { Console.WriteLine(node.Name); } ``` 在上面的示例中,我们首先创建了一个树形结构的数据,并使用Traverse方法遍历整个树形结构。然后,我们使用LINQ查询语法从遍历的结果中筛选出Id为偶数的节点,并输出它们的Name属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值