c#所有部门及其下所部门生成树形图(递归算法获取或键值对方式获取)
部门数据库的设计:
代码:
/// <summary>
/// 获取部门(入口)
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("GetDepart")]
public ResultEntity<List<JieDian>> GetDepart()
{
ResultEntity<List<JieDian>> result = new ResultEntity<List<JieDian>>();
int? officeId = ;
try
{
officeId = new AuthInfo().GetOfficeId(User as ClaimsPrincipal);
if (!officeId.HasValue)
{
result.IsSuccess = false;
result.ErrorCode = ;
result.Msg = "未登录或已过期";
return result;
}
ProvinceMeetCase meetCase = new ProvinceMeetCase();
var data = meetCase.creatTree();
result.Data = data;
result.IsSuccess = true;
result.Msg = "部门获取成功";
}
catch (Exception e)
{
result.ErrorCode = ;
result.Msg = e.ToString();
} return result;
}
第一种解决方案(递归):
//生成树的方法
public List<JieDian> creatTree()
{
List<JieDian> result = new List<JieDian>();
try
{
using (var container = new TRA_EXTContainer())
{
string sql = string.Format(@"SELECT a.Name [DepartName],a.Id [DepartId]
FROM [HYSYZSCCODB].[dbo].[Department] a
where a.IsValid='true' and a.Level = 1");
//这里改成你的数据库表
var data = container.Database.SqlQuery<DepartDTO>(sql).ToList(); //这里我直接调用了我库中的类
foreach (var item in data)
{
JieDian jd = new JieDian();
jd.Id = item.DepartId;
jd.Name = item.DepartName;
var d = creatTheTree(item.DepartId, jd);
if (d == null)
{
result.Add(jd);
continue;
}
result.Add(d);
}
}
}
catch (Exception e)
{
throw e;
} return result;
} //生成树的方法(自身方法不断循环)
public JieDian creatTheTree(Guid parentId, JieDian jd)
{
//获取
DepartDTO[] items = GetTheItems(parentId);
//如果没有字节点了,那就返回空
if (items.Length == )
return null;
List<JieDian> jdList = new List<JieDian>();
for (int i = ; i < items.Length; i++)
{
JieDian jiedian = new JieDian();
jiedian.Id = items[i].DepartId;
jiedian.Name = items[i].DepartName;
jiedian.ParentId = items[i].ParentId;
//递归循环
creatTheTree(items[i].DepartId, jiedian);
jdList.Add(jiedian);
}
jd.children = jdList.ToArray(); //由于对象是引用类型,因为可以改变参数的值
return jd;
} public class JieDian
{
/// <summary>
///
/// </summary>
public string Name { get; set; }
/// <summary>
///
/// </summary>
public Guid Id { get; set; }
/// <summary>
///
/// </summary>
public Guid ParentId { get; set; }
/// <summary>
///
/// </summary>
public JieDian[] children = null;
}
第二种解决方案(key-Value):
#region 尝试不用递归生成树(更简洁高效)
public class ResChapter
{
public string Id { get; set; }
public string Name { get; set; }
public string Pid { get; set; }
public List<ResChapter> Children { get; set; }
} public List<ResChapter> toTree()
{
using (var container = new TRA_EXTContainer())
{
//数据库中的Id和父级Id都是Guid类型,取出的时候转为string类型,而第一级部门PDepartmentId为空,我们用isnull(cast(a.Id as varchar(40)),'')进行处理,如果为空就返回空字符串,否则就把guid转为字符串取出来。
//cast(a.Id as varchar(40)) -----将id转为字符串的操作
string sql = string.Format(@"SELECT a.Name [Name],isnull(cast(a.Id as varchar(40)),'') [Id],isnull(cast(a.PDepartmentId as varchar(40)),'') [Pid]
FROM [HYSYZSCCODB].[dbo].[Department] a
where a.IsValid='true' ");
//这里改成你的数据库表
var data = container.Database.SqlQuery<ResChapter>(sql).ToList(); //这里我直接调用了我库中的类
var chapterlist = data;
var dic = new Dictionary<string, ResChapter>(chapterlist.Count);
foreach (var chapter in chapterlist)
{
dic.Add(chapter.Id, chapter);
}
foreach (var chapter in dic.Values)
{
if (dic.ContainsKey(chapter.Pid))
{
if (dic[chapter.Pid].Children == null)
dic[chapter.Pid].Children = new List<ResChapter>();
dic[chapter.Pid].Children.Add(chapter);
}
}
var dateTree = dic.Values.Where(t => string.IsNullOrEmpty(t.Pid)).ToList();
return dateTree;
}
}
#endregion
获取上属父级部门:
using (var context = new YZS_TRAEntities())
{
var Office = context.事务所主任.Where(f => f.事务所主任ID == officeId).FirstOrDefault();
if (Office == null)
{
result.ErrorCode = ;
result.IsSuccess = false;
result.Msg = "未找到当前登陆人";
return result;
}
UpdateMeetStatus(container);
string sql = string.Format(@"SELECT a.[Name] [EmployeeName],a.Mobile [EmployeePhone],b.Name [DepartName],b.Id [DepartId],b.PDepartmentId [ParentId]
FROM [HYSYZSCCODB].[dbo].[Employee] a
inner join [HYSYZSCCODB].[dbo].[Department] b on b.EmployeeId = a.Id
where b.IsValid='true' and a.Mobile =" + "'" + Office.手机.Trim() + "'");
var entity = container.Database.SqlQuery<OfficeDTO>(sql).FirstOrDefault(); //当前事务所主任的部门
if (entity.ParentId.HasValue)
{
var data = GetParentDeparts(entity.ParentId.Value, list); //获取上级所有部门
data.Add(entity); //再把自身加上
ids = data.Select(f => f.DepartId).ToList();
}
ids.Add(entity.DepartId);
} #region 递归获取父级部门
public List<OfficeDTO> GetParentDeparts(Guid parentId, List<OfficeDTO> list)
{
using (var container = new TRA_EXTContainer())
{ //根据父节点获取选项集合
string sql = string.Format(@"SELECT a.Name [DepartName],a.Id [DepartId],a.PDepartmentId [ParentId]
FROM [HYSYZSCCODB].[dbo].[Department] a
where a.IsValid='true' and a.Id = " + "'" + parentId + "'");
//这里改成你的数据库表
var entity = container.Database.SqlQuery<OfficeDTO>(sql).FirstOrDefault();
if (entity != null)
{
list.Add(entity);
if (entity.ParentId.HasValue)
{
GetParentDeparts(entity.ParentId.Value, list);
}
}
}
return list; }
#endregion
c#所有部门及其下所部门生成树形图(递归算法获取或键值对方式获取)的更多相关文章
- c#字典怎么获取第一个键值 List<对象>获取重复项,转成Dictionary<key,List<对象>>
c#字典怎么获取第一个键值 Dictionary<string, int> dictionary = new Dictionary<string, int>(); dictio ...
- location将地址栏参数拆分成键值对的对象
window.location可获取地址栏的一系列信息,并且每个浏览器都支持该属性,非常方便.而获取到的问号后面的参数可以进行加工转变成我们所想要的键值对. location的属性: 属性名 例子 说 ...
- 键值集合List转换成datatable
/// <summary> /// 键值集合List转换成datatable /// </summary> /// <param name="data" ...
- js中对象转化成字符串、数字或布尔值的转化规则
js中对象可以转化成 字符串.数字.布尔值 一.对象转化成字符串: 规则: 1.如果对象有toString方法,则调用该方法,并返回相应的结果:(代码通常会执行到这,因为在所有对象中都有toStrin ...
- jquery不能是使用普通的for循环 因为普通的for循环通过下表获取对象 如果通过下表获取对象的话 会转成dom对象
jquery不能是使用普通的for循环 因为普通的for循环通过下表获取对象 如果通过下表获取对象的话 会转成dom对象
- java 把json对象中转成map键值对
相关:Json对象与Json字符串的转化.JSON字符串与Java对象的转换 本文的目的是把json串转成map键值对存储,而且只存储叶节点的数据 比如json数据如下: {responseHeade ...
- .Net将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),并使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA
前言: 前段时间因为项目进度比较繁重所以一直都没有时间更新博客,内心深深的负重感,没有履行年初立下的flag.不过这个月会把上个月没有完成的任务补上来,咱们可不是喜欢拖欠任务的攻城狮.哈哈,废话不多说 ...
- php将一个字符串转变成键值对数组的效率问题
有这样一种需求,将形式为"TranAbbr=IPER|AcqSsn=000000073601|MercDtTm=20090615144037"的字符串转换成如下格式的数组: Arr ...
- 将bean转换成键值列表
日常开发中在进行接口对接的数据传输时,有一种场景是将bean转成jsonString,这里可以将bean转换成Map再转成jsonString. 工具类如下: public static String ...
随机推荐
- mint-ui Infinite scroll 重复加载、加载无效的原因及解决方案
1.无限滚动的运用场景: 一般运用在列表展示,有分页.下拉加载更多的需求中. 2.代码分析 代码很简单,实现了列表分页,数据加载完之后显示数据状态 <template> <div c ...
- Ubuntu18.04 安装 VMwareTools
VMwareTools作用: 1.增强虚拟显卡和硬盘性能.以及同步虚拟机与主机时钟的驱动程序. 2.可以从物理主机直接往虚拟机里面拖文件. 3.鼠标进入虚拟机后可以直接出来,无需按CTRL+ALT才可 ...
- Rpc简单入门
RPC这个概念大家都应该很熟悉了,这里不在累述了:使用场景可以参考这篇,本篇主要分享下Thrift和Grpc在.Net Core环境下使用入门.Thirft或者Grps 都支持跨语言.跨平台的Rpc框 ...
- Android应用内实现视频播放--腾讯浏览服务(TBS)
TBS视频播放 TBS视频播放器可以支持市面上几乎所有的视频格式,包括mp4, flv, avi, 3gp, webm, ts, ogv, m3u8, asf, wmv, rm, rmvb, mov, ...
- 从零开始学 Web 之 Vue.js(一)Vue.js概述,基本结构,指令,事件修饰符,样式
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- git第九节---git命令实战
1. git 项目创建 mkdir git-command 2.git 配置 git config --list 配置用户名 邮箱 git config user.name 'XXX' --loca ...
- [转]angular2之@Output() EventEmitter
本文转自:https://www.jianshu.com/p/f2768f927c86 A src/app/components/contains/contain1.ts import { Compo ...
- [转]VR原理讲解及开发入门
本文转自:http://www.52vr.com/article-661-1.html 本文是作者obuil根据多年心得专门为想要入门的VR开发者所写,由52VR网站提供支持. 1. VR沉浸感和 ...
- IDEA操作技巧与Tomcat集成
一.Tomcat Tomcat是基于Java的一个开放源代码.运行servlet和JSP Web应用的Web应用软件容器.Tomcat是Apache软件基金会(Apache Software Foun ...
- .Net Core 简单定时任务框架封装
有段日子没有更新,写点东西冒个泡 .这篇文章过来讲个小东西,也是大家在日常开发中也经常需要面临的问题:后台定时任务处理.估计大家看到这句就已经联想到 QuartZ 等类似第三方类库了,不好意思,后边的 ...