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

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

下面是BaseService的方法

下面方法用于拼接字符串

主体方法--

/// <summary>
/// 得到****TreeGrid****的Json ,后台用于管理页面
/// </summary>
public string GetAllLeftMenu4TreeGridJson()
{
StringBuilder allLeftMenuJsonStr = new StringBuilder();
allLeftMenuJsonStr.Append("["); //int normal = Convert.ToInt32(Common.Enum.DelFlagEnum.Normal);//lambda表达式中不可以有类型转换
//List<AdminLeftMenuInfo> adminLeftMenuInfos = GetEntitesQueryable(m => m.DelFlag == normal).ToList();
List<AdminLeftMenuInfo> adminLeftMenuInfos = GetEntitesQueryable(m => m.DelFlag != -1).ToList(); //这样就是查询所有 软删除的也查询,未删除的也查询,便于前台进行管理 foreach (var adminLeftMenuInfo in adminLeftMenuInfos)
{
if (adminLeftMenuInfo.ParentId == 0) //如果该元素的父ID为0 则是顶级元素
{
allLeftMenuJsonStr.Append("{");
allLeftMenuJsonStr.Append("\"text\":\" " + adminLeftMenuInfo.PageName + " \" ");
allLeftMenuJsonStr.Append(",");
allLeftMenuJsonStr.Append("\"url\":\" " + adminLeftMenuInfo.PageUrl + " \" ");
allLeftMenuJsonStr.Append(",");
allLeftMenuJsonStr.Append("\"delFlag\":\" " + adminLeftMenuInfo.DelFlag + " \" ");
allLeftMenuJsonStr.Append(",");
allLeftMenuJsonStr.Append("\"Id\":\" " + adminLeftMenuInfo.Id + " \" ");
allLeftMenuJsonStr.Append(",");
allLeftMenuJsonStr.Append("\"iconCls\":\"task-folder\"");
allLeftMenuJsonStr.Append(",");
allLeftMenuJsonStr.Append("\"expanded\":true"); List<AdminLeftMenuInfo> childrens = adminLeftMenuInfos.Where(m => m.ParentId == adminLeftMenuInfo.Id).ToList();
if (childrens.Count != 0) //如果他还有儿子---拼接儿子
{
allLeftMenuJsonStr.Append(",");
allLeftMenuJsonStr.Append("\"children\":");
DoAppendChildJson4TreeGrid(childrens, allLeftMenuJsonStr, adminLeftMenuInfos); } allLeftMenuJsonStr.Append("},"); }
}
allLeftMenuJsonStr.Remove(allLeftMenuJsonStr.Length - 1, 1);
allLeftMenuJsonStr.Append("]");
return allLeftMenuJsonStr.ToString();
} private void DoAppendChildJson4TreeGrid(List<AdminLeftMenuInfo> childrens, StringBuilder allLeftMenuJsonStr, List<AdminLeftMenuInfo> adminLeftMenuInfos)
{
allLeftMenuJsonStr.Append("[");
foreach (var children in childrens)
{
//判断children是否还有儿子,如果有为folder,如果没有儿子就是leaf,
//并且checked=false;
// var son = GetEntitesQueryable(m => m.ParentId == children.Id);
List<AdminLeftMenuInfo> son = adminLeftMenuInfos.Where(m => m.ParentId == children.Id).ToList();
if (son.Count == 0) //没有儿子了 那么他就是叶子
{
allLeftMenuJsonStr.Append("{");
allLeftMenuJsonStr.Append("\"text\":\"" + children.PageName + "\"");
allLeftMenuJsonStr.Append(",");
allLeftMenuJsonStr.Append("\"leaf\":true");
allLeftMenuJsonStr.Append(",");
allLeftMenuJsonStr.Append("\"delFlag\":\" " + children.DelFlag + " \" ");
allLeftMenuJsonStr.Append(",");
allLeftMenuJsonStr.Append("\"iconCls\":\"task\"");
allLeftMenuJsonStr.Append(",");
allLeftMenuJsonStr.Append("\"Id\":\" " + children.Id + " \" ");
allLeftMenuJsonStr.Append(",");
allLeftMenuJsonStr.Append("\"url\":\" " + children.PageUrl + " \" ");
allLeftMenuJsonStr.Append("},");
}
else//有儿子 那么他就是文件夹
{
allLeftMenuJsonStr.Append("{");
allLeftMenuJsonStr.Append("\"text\":\"" + children.PageName + "\"");
allLeftMenuJsonStr.Append(",");
allLeftMenuJsonStr.Append("\"iconCls\":\"task-folder\"");
allLeftMenuJsonStr.Append(",");
allLeftMenuJsonStr.Append("\"expanded\":true");
allLeftMenuJsonStr.Append(",");
allLeftMenuJsonStr.Append("\"url\":\" " + children.PageUrl + " \" ");
allLeftMenuJsonStr.Append(",");
allLeftMenuJsonStr.Append("\"delFlag\":\" " + children.DelFlag + " \" ");
allLeftMenuJsonStr.Append(",");
allLeftMenuJsonStr.Append("\"Id\":\" " + children.Id + " \" ");
allLeftMenuJsonStr.Append(",");
allLeftMenuJsonStr.Append("\"children\":");
DoAppendChildJson4TreeGrid(son, allLeftMenuJsonStr,adminLeftMenuInfos);
allLeftMenuJsonStr.Append("},");
} }
allLeftMenuJsonStr.Remove(allLeftMenuJsonStr.Length - 1, 1);
allLeftMenuJsonStr.Append("]");
}

  

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

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

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

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

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

优化描述:整个过程中只有一次查询数据库,这就是linq的筛选好处所在。每次进入递归的时候,都会把我们第一个主体方法查出来的List集合作为参数

传递进去。这样一来,避免了递归方法中查询,递归中的查询是很影响效率的。

最后效果图奉上

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

  1. 分享一个关于jackson的Json工具类

    直接贴代码: import org.codehaus.jackson.map.DeserializationConfig.Feature; import org.codehaus.jackson.ma ...

  2. 分享一个 pycharm 专业版的永久使用方法

    刚开始接触Python,首先要解决的就是Python开发环境的搭建. 目前比较好用的Python开发工具是PyCharm,他有社区办和专业版两个版本,但是社区版支持有限,我们既然想好好学python, ...

  3. .NET ->> 分享一个字符串模糊匹配指数的方法

    链接: http://www.tsjensen.com/blog/post/2011/05/27/Four+Functions+For+Finding+Fuzzy+String+Matches+In+ ...

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

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. [C#]一个简易的、轻量级的方法并行执行线程辅助类

      一个简易的.轻量级的方法并行执行线程辅助类 在实际应用中,经常要让多个方法并行执行以节约运行时间,线程就是必不可少的了,而多线程的管理经常又是一件头疼的事情,比如方法并行执行异步的返回问题,方法并 ...

  6. python判断字符串是否是json格式方法分享

    python判断字符串是否是json格式方法分享 在实际工作中,有时候需要对判断字符串是否为合法的json格式 解决方法使用json.loads,这样更加符合'Pythonic'写法 代码示例:   ...

  7. 分享一个解决MySQL写入中文乱码的方法

    分享一个解决MySQL写入中文乱码的方法 之前有发帖请教过如何解决MySQL写入中文乱码的问题.但没人会,或者是会的人不想回答.搜索网上的答案并尝试很多次无效,所以当时就因为这个乱码问题搁浅了一个软件 ...

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

    首页 给出  DataTable 转Json 的方法: public static string TableToJson(DataTable dt) { List<Dictionary<s ...

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

    原文:分享一个解析XML成为php数组的方法 <?php /* * To change this template, choose Tools | Templates * and open th ...

随机推荐

  1. 欢迎访问我的快站fbengine.kuaizhan.com

    欢迎访问我的快站 fbengine.kuaizhan.com

  2. 赴美工作常识(Part 6 - 绿卡排队)

    上一篇<赴美工作常识(Part 5 - 绿卡优先级)>解释完排队的优先级是怎么确定的,以及 PERM 和 I–140 表的意义,接下来就要解释一下队具体是怎么排的以及排到之后的 I–485 ...

  3. sublime 3 快捷键

    来自(http://dengo.org/archives/970) Sublime text 3是我最喜欢的代码编辑器,每天和代码打交道,必先利其器,掌握基本的代码编辑器的快捷键,能让你打码更有效率. ...

  4. 三天学会HTML5——SVG和Canvas的使用

    在第一天学习了HTML5的一些非常重要的基本知识,今天将进行更深层学习 首先来回顾第一天学习的内容,第一天学习了新标签,新控件,验证功能,应用缓存等内容. 第2天将学习如何使用Canvas 和使用SV ...

  5. Java关于流知识总结

    流总结: 一.流的分类: 数据单位:字节流  字符流 方向:  输出流 输入流 角色:  节点流 套节流 字节流:以Stream结尾. 字符流:以Reader 和Writer 结尾. 输入流:所有带有 ...

  6. Oracle增删改DML脚本记录

    --insert into添加数据 ','王军','男'); --提交事物 commit; --回滚事物 --rollback; insert into teacher1 select * from ...

  7. C#学习系列-类与结构的区别

    参考:http://www.microsoftvirtualacademy.com/Content/ViewContent.aspx?et=9851&m=9830&ct=31038 如 ...

  8. php优点

    PHP,一个嵌套的缩写名称,是英文超级文本预处理语言(PHP:Hypertext Preprocessor)的缩写.PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本 ...

  9. javascript中关于日期和时间的基础知识

    × 目录 [1]标准时间 [2]字符串 [3]闰年[4]月日[5]星期[6]时分秒 前面的话 在介绍Date对象之前,首先要先了解关于日期和时间的一些知识.比如,闰年.UTC等等.深入了解这些,有助于 ...

  10. art-template用户注册方法

    应用场景nodejs Express框架,使用art-template模板引擎. 后台注册方法代码: var template = require('art-template'); template. ...