分享一个递归无限级拼接Json的方法---ExtJs的TreePanel和TreeGrid均适用(Ef,Lambda,Linq,IQueryable,List)

话不多说,先上实体类,如果你不是codefirst,就把它当成数据表结构。

下面是底层BaseDal获取数据的方法  (如果你没有Base类,直接写在你的DAL层和BLL层)

下面是BaseService的方法

下面方法用于拼接字符串

主体方法--

 1 /// <summary>
 2         /// 得到树TreePanel的Json
 3         /// </summary>
 4         /// <returns></returns>
 5         public string GetAllLeftMenu4TreePanelJson()
 6         {
 7             StringBuilder allLeftMenuJsonStr = new StringBuilder();
 8             allLeftMenuJsonStr.Append("[");
 9             int normal = Convert.ToInt32(Common.Enum.DelFlagEnum.Normal);//lambda表达式中不可以有类型转换
10             List<AdminLeftMenuInfo> adminLeftMenuInfos = GetEntitesQueryable(m => m.DelFlag == normal).ToList();
11             foreach (var adminLeftMenuInfo in adminLeftMenuInfos)
12             {
13                 if (adminLeftMenuInfo.ParentId == 0)           //如果该元素的父ID为0   则是顶级元素
14                 {
15                     allLeftMenuJsonStr.Append("{");
16                     allLeftMenuJsonStr.Append("\"text\":\" " + adminLeftMenuInfo.PageName + " \"  ");
17                     allLeftMenuJsonStr.Append(",");
18
19                     allLeftMenuJsonStr.Append("\"checked\":false");
20                     allLeftMenuJsonStr.Append(",");
21                     allLeftMenuJsonStr.Append("\"cls\":\"folder\"");
22
23
24                     List<AdminLeftMenuInfo> childrens = adminLeftMenuInfos.Where(m => m.ParentId == adminLeftMenuInfo.Id).ToList();
25                     if (childrens.Count != 0) //如果他还有儿子---拼接儿子
26                     {
27                         allLeftMenuJsonStr.Append(",");
28                         allLeftMenuJsonStr.Append("\"children\":");
29                         // var newChildrens=
30                         DoAppendChildJson4TreePanel(childrens, allLeftMenuJsonStr);
31
32                     }
33
34                     allLeftMenuJsonStr.Append("},");
35
36                 }
37             }
38             allLeftMenuJsonStr.Remove(allLeftMenuJsonStr.Length - 1, 1);
39             allLeftMenuJsonStr.Append("]");
40             return allLeftMenuJsonStr.ToString();
41         }
42         /// <summary>
43         /// 用于全部TreePanel的递归子叶子的方法
44         /// </summary>
45         /// <param name="childrens">儿子作为参数</param>
46         /// <param name="allLeftMenuJsonStr">把需要继续拼接的Json字符串传进来</param>
47         private void DoAppendChildJson4TreePanel(List<AdminLeftMenuInfo> childrens, StringBuilder allLeftMenuJsonStr)
48         {
49             allLeftMenuJsonStr.Append("[");
50             foreach (var children in childrens)
51             {
52                 //判断children是否还有儿子,如果有为folder,如果没有儿子就是leaf,
53                 //并且checked=false;
54                 //   var son = GetEntitesQueryable(m => m.ParentId == children.Id);
55                 List<AdminLeftMenuInfo> son = GetEntitesQueryable(m => m.ParentId == children.Id).ToList();
56                 if (son.Count == 0)  //没有儿子了 那么他就是叶子
57                 {
58                     allLeftMenuJsonStr.Append("{");
59                     allLeftMenuJsonStr.Append("\"text\":\"" + children.PageName + "\"");
60                     allLeftMenuJsonStr.Append(",");
61                     allLeftMenuJsonStr.Append("\"leaf\":true");
62                     allLeftMenuJsonStr.Append(",");
63                     allLeftMenuJsonStr.Append("\"checked\":false");
64                     allLeftMenuJsonStr.Append("},");
65                 }
66                 else//有儿子 那么他就是文件夹
67                 {
68                     allLeftMenuJsonStr.Append("{");
69                     allLeftMenuJsonStr.Append("\"text\":\"" + children.PageName + "\"");
70                     allLeftMenuJsonStr.Append(",");
71                     allLeftMenuJsonStr.Append("\"cls\":\"folder\"");
72                     allLeftMenuJsonStr.Append(",");
73                     allLeftMenuJsonStr.Append("\"checked\":false");
74                     allLeftMenuJsonStr.Append(",");
75                     allLeftMenuJsonStr.Append("\"children\":");
76                     DoAppendChildJson4TreePanel(son, allLeftMenuJsonStr);    //如果还有儿子  那么就一直递归下去
77                     allLeftMenuJsonStr.Append("},");
78                 }
79
80             }
81             allLeftMenuJsonStr.Remove(allLeftMenuJsonStr.Length - 1, 1);
82             allLeftMenuJsonStr.Append("]");
83         }

至于为什么我要把IQueryable转成List来操作,原因很简单:

Ef延迟加载,会在调用的时候,来执行代码,比如我们判断IQueryable<T>   t==null的时候  ,这时才会执行之前定义的查询动作。

如果此处一直操作Iqueryable,当我们第一次执行延迟加载动作查询数据库之后,第二次想使用同一个Iqueryable的时候,就会报错:

错误内容大概是SqlDataReader已经打开一个链接,请先将此链接关闭。错误是什么原因呢,就是第一次延迟加载后,连接并没有关闭,

在第二次调用集合离线查询的时候,代码会以为你还要重新执行查询,这时候是不允许的,所以为了离线操作,转换为了List集合,在内存中随便玩。

最后效果图奉上

时间: 2024-10-14 14:43:56

分享一个递归无限级拼接Json的方法---ExtJs的TreePanel和TreeGrid均适用(Ef,Lambda,Linq,IQueryable,List)的相关文章

分享一个js加密的几种方法

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="http://libs.baidu.com/jquery/1.9.0/jquery.min.js"></script> <script src=&q

利用多叉树实现Ext JS中的无限级树形菜单(一种构建多级有序树形结构JSON的方法)

一.问题研究的背景和意义 目前在Web应用程序开发领域,Ext JS框架已经逐渐被广泛使用,它是富客户端开发中出类拔萃的框架之一.在Ext的UI控件中,树形控件无疑是最为常用的控件之一,它用来实现树形结构的菜单.TreeNode用来实现静态的树形菜单,AsyncTreeNode用来实现动态的异步加载树形菜单,后者最为常用,它通过接收服务器端返回来的JSON格式的数据,动态生成树形菜单节点.动态生成树有两种思路:一种是一次性生成全部树节点,另一种是逐级加载树节点(利用AJAX,每次点击节点时查询下

分享在Linux下使用OSGi.NET插件框架快速实现一个分布式服务集群的方法

在这篇文章我分享了如何使用分层与模块化的方法来设计一个分布式服务集群.这个分布式服务集群是基于DynamicProxy.WCF和OSGi.NET插件框架实现的.我将从设计思路.目标和实现三方面来描述. 1 设计思路 首先,我来说明一下设计思路.我们先来看看目前OSGi.NET插件框架的服务.在这里,服务不是远程服务,它是轻量级的服务,由接口和实现类组成,如下图所示.服务契约插件定义了服务接口,服务实现插件向服务总线注册服务,服务调用插件利用服务契约(接口)从服务总线获取实现的服务并调用,服务实现

分享一个快速的Json(反)序列化开源项目 Jil

我们不缺少JSON的序列化库,但我们缺少一个性能非常好的库,这对于网站来说非常重要.今天我发现了Jil. 他是开源的代码: https://github.com/kevin-montrose/Jil 在他主页上有详细的介绍其性能的表现,我这里就不转述了,他最重要的特点就是性能,Emit那当然不会少了,当想让他超越其他的库光一个Emit肯定不行,他还有很多其他的优化. 公共缓冲区 为介绍GC的压力,他使用了诸如builder.CommonCharBuffer这样的功能缓冲,builder.Comm

JSON.parse() 方法解析一个JSON字符串

JSON.parse() 方法解析一个JSON字符串,构造由字符串描述的JavaScript值或对象.可以提供可选的reviver函数以在返回之前对所得到的对象执行变换. 语法EDIT JSON.parse(text[, reviver]) 参数 text 要被解析成JavaSctipt值的字符串,查看 JSON 对象学习的JSON 语法的说明. reviver 可选 如果是一个函数,则规定了原始值如何被解析改造,在被返回之前. 返回值 Object对应给定的JSON文本. 异常 若被解析的 J

分享一个二进制转字符串的方法

1 public string ByteToString(byte[] inputBytes) 2 { 3 StringBuilder temp = new StringBuilder(2048); 4 foreach (byte tempByte in inputBytes) 5 { 6 temp.Append(tempByte > 15 ? 7 Convert.ToString(tempByte, 2) : '0' + Convert.ToString(tempByte, 2)); 8 }

分享一个解析XML成为php数组的方法

原文:分享一个解析XML成为php数组的方法 <?php /* * To change this template, choose Tools | Templates * and open the template in the editor. */ $xml = 'site_1.xml'; $myxml = simplexml_load_file($xml); // print_r($myxml); print_r(xmlToArray($myxml)); function xmlToArra

分享一个 Java String split 快速分割的方法

java中string.split() 方法比较强大,但是split()方法采用正则表达式,速度相对会慢一点, 其实大多数场景下并不需要使用正则表达式,下面分享一个不使用正则表达式分隔字符串的方法. 方法保证了和 string.split()的输出结果一致. 直接看代码: public static String[] split(String src,String delimeter){ String srcStr = src; String delimeterStr = delimeter;

c#输出json,其中包含子json (可以含 无限级 子json)的方法思路

首页 给出  DataTable 转Json 的方法: 1 public static string TableToJson(DataTable dt) 2 { 3 List<Dictionary<string, object>> list = new List<Dictionary<string, object>>(); 4 foreach (DataRow dr in dt.Rows)//每一行信息,新建一个Dictionary<string,ob