部门数据库的设计:

代码:

        /// <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#所有部门及其下所部门生成树形图(递归算法获取或键值对方式获取)的更多相关文章

  1. c#字典怎么获取第一个键值 List<对象>获取重复项,转成Dictionary<key,List<对象>>

    c#字典怎么获取第一个键值 Dictionary<string, int> dictionary = new Dictionary<string, int>(); dictio ...

  2. location将地址栏参数拆分成键值对的对象

    window.location可获取地址栏的一系列信息,并且每个浏览器都支持该属性,非常方便.而获取到的问号后面的参数可以进行加工转变成我们所想要的键值对. location的属性: 属性名 例子 说 ...

  3. 键值集合List转换成datatable

    /// <summary> /// 键值集合List转换成datatable /// </summary> /// <param name="data" ...

  4. js中对象转化成字符串、数字或布尔值的转化规则

    js中对象可以转化成 字符串.数字.布尔值 一.对象转化成字符串: 规则: 1.如果对象有toString方法,则调用该方法,并返回相应的结果:(代码通常会执行到这,因为在所有对象中都有toStrin ...

  5. jquery不能是使用普通的for循环 因为普通的for循环通过下表获取对象 如果通过下表获取对象的话 会转成dom对象

    jquery不能是使用普通的for循环 因为普通的for循环通过下表获取对象 如果通过下表获取对象的话 会转成dom对象

  6. java 把json对象中转成map键值对

    相关:Json对象与Json字符串的转化.JSON字符串与Java对象的转换 本文的目的是把json串转成map键值对存储,而且只存储叶节点的数据 比如json数据如下: {responseHeade ...

  7. .Net将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),并使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA

    前言: 前段时间因为项目进度比较繁重所以一直都没有时间更新博客,内心深深的负重感,没有履行年初立下的flag.不过这个月会把上个月没有完成的任务补上来,咱们可不是喜欢拖欠任务的攻城狮.哈哈,废话不多说 ...

  8. php将一个字符串转变成键值对数组的效率问题

    有这样一种需求,将形式为"TranAbbr=IPER|AcqSsn=000000073601|MercDtTm=20090615144037"的字符串转换成如下格式的数组: Arr ...

  9. 将bean转换成键值列表

    日常开发中在进行接口对接的数据传输时,有一种场景是将bean转成jsonString,这里可以将bean转换成Map再转成jsonString. 工具类如下: public static String ...

随机推荐

  1. Go语言标准库之time

    Go语言标准库之time 时间的格式化和解析 格式化 Format Go语言和其他语言的时间格式化的方式不同,Go语言格式化的方式更直观,其他的语言一般是yyyy-mm-dd package main ...

  2. C# winform嵌入unity3D

    最近做项目需要winform嵌入unity的功能,由于完全没接触过这类嵌入的于是在网上搜,有一种方法是UnityWebPlayer插件,也开始琢磨了一段时间,不过一会发现在5.4版本以后这个东西就被淘 ...

  3. springboot + mybatis

    这两天启动了一个新项目因为项目组成员一直都使用的是mybatis,虽然个人比较喜欢jpa这种极简的模式,但是为了项目保持统一性技术选型还是定了 mybatis.到网上找了一下关于spring boot ...

  4. QC内部分享ppt

    Quality Center是一个基于Web的测试管理工具,可以组织和管理应用程序测试流程的所有阶段,包括制定测试需求.计划测试.执行测试和跟踪缺陷.此外,通过Quality Center还可以创建报 ...

  5. Apache Commons Digester 二(规则模块绑定-RulesModule、异步解析-asyncParse、xml变量Substitutor、带参构造方法)

    前言 上一篇对Digester做了基本介绍,也已经了解了Digester的基本使用方法,接下来将继续学习其相关特性,本篇主要涉及以下几个内容: 规则模块绑定,通过定义一个RulesModule接口实现 ...

  6. Linux 常用命令 | mkdir/rmdir/touch 的使用

    一.创建空目录 命令:mkdir 原意:make directories 所在路径: /bin/mkdir 1.创建空目录 ​ 2.递归创建空目录 选项:-p 如果直接使用mkdir 创建空目录: W ...

  7. Filebeat的Registry文件解读

    你可能没有注意但很重要的filebeat小知识 Registry文件 Filebeat会将自己处理日志文件的进度信息写入到registry文件中,以保证filebeat在重启之后能够接着处理未处理过的 ...

  8. 【机器学习】逻辑回归(Logistic Regression)

    注:最近开始学习<人工智能>选修课,老师提纲挈领的介绍了一番,听完课只了解了个大概,剩下的细节只能自己继续摸索. 从本质上讲:机器学习就是一个模型对外界的刺激(训练样本)做出反应,趋利避害 ...

  9. leetcode — palindrome-number

    import org.lep.leetcode.parseint.IntegerParser; /** * Source : https://oj.leetcode.com/problems/pali ...

  10. Windows版本redis高可用方案探究

    目录 Windows版本redis高可用方案探究 前言 搭建redis主从 配置主redis-28380 配置从redis-23381 配置从redis-23382 将redis部署为服务 启动red ...