话不多说,先上实体类,如果你不是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. [php入门] 4、HTML基础入门一篇概览

    [php入门] 1.从安装开发环境环境到(庄B)做个炫酷的登陆应用 [php入门] 2.基础核心语法大纲 [php入门] 3.WAMP中的集成MySQL相关基础操作 1.HTML的作用 HTML是超文 ...

  2. 手把手教你用python打造网易公开课视频下载软件3-对抓取的数据进行处理

    上篇讲到抓取的数据保存到rawhtml变量中,然后通过编码最终保存到html变量当中,那么html变量还会有什么问题吗?当然会有了,例如可能html变量中的保存的抓取的页面源代码可能有些标签没有关闭标 ...

  3. 使用oracle的大数据工具ODCH访问HDFS数据文件

    软件下载 Oracle Big Data Connectors:ODCH 下载地址: http://www.oracle.com/technetwork/bdc/big-data-connectors ...

  4. IOS 推送-客户端处理推送消息

    IOS 推送-客户端处理推送消息 1.推送调用顺序 APN push的消息到达后,UIApplicationDelegate有两个方法和处理消息有关: 1)application:didReceive ...

  5. 奇怪的BUG

    熟语说“常在河边走,哪能不湿鞋”,在现实中我想说:“代码写多了,总会遇到奇怪的bug”,遇到bug不可怕,可怕的是不自己不知道这么解决,有些bug能当时解决,有些在自己知识水平提高后知道如何解决.还有 ...

  6. Redis和Memcached的区别详解

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/119.html?1455855360 Redis的作者Salvatore ...

  7. 用css3实现各种图标效果(2)

    写在前面 写的一模一样的css样式,结果却导致原来出来不一样的效果图. 用chrome的开发者工具查看,比较起来还是一模一样的css样式,可为什么会出现不一样的placeholder效果呢?一个白色粗 ...

  8. atitit。企业的价值观 员工第一 vs 客户第一.docx

    atitit.企业的价值观 员工第一 vs 客户第一.docx 1. 客户第一的说法是错误的,员工优先是正确的,理念与价值观1 1.1. 任何一个组织,应该组织成员优先级要比外部成员高才对1 1.2. ...

  9. 处于同一个域中的两台Sql server 实例无法连接

    处于同一个域中的两台Sql server 实例无法连接,报的错误信息如下: A network-related or instance-specific error occurred while es ...

  10. 引入CSS文件的@import与link的权重分析

    我很少在CSS用到@import这个标签,最近看到一句话“link方式的样式的权重 高于@import的权重”,感觉不太对,@import只是一个引入外部文件而已,怎么会有高于link的权重呢?于是我 ...