c#所有部门及其下所部门生成树形图(递归算法获取或键值对方式获取)
第一种解决方案(递归):
//生成树的方法 public List<JieDian> creatTree() { List<JieDian> result = new List<JieDian>(); try { 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 == 0) return null; List<JieDian> jdList = new List<JieDian>(); for (int i = 0; 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() { //数据库中的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
获取上属父级部门:
try{
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);
}
catch(Exception ex){
}
} #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
原文链接:https://www.cnblogs.com/likui-bookHouse/p/9579944.html
分类:
.net / C#
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)