部门数据库的设计:

代码:

        /// <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. vue项目中在同一页面多次引入同一个echarts图表的自适应问题

    在父组件页面引入两次该图表子组件显示的效果: 由于是百分比宽高,所以在窗口发生变化时,需要让图表也跟着自适应,所以才出现了本次讨论的问题啦. 先看下完整的图表子组件代码(在父组件就是直接引入,不需要传 ...

  2. JAVA发送http get/post请求,调用http接口、方法

    import java.io.BufferedReader; import java.io.IOException;import java.io.InputStream; import java.io ...

  3. ssh的两个小知识

    ssh的两个小知识 1. 在ssh客户端启动远程服务器的图形界面程序. 如果你试图在ssh客户端运行远程服务器的一个图形界面程序,比如说执行firefox,此时可能会提示,can not connec ...

  4. sip 注册流程

    基本注册流程示意图: 注册流程描述如下: 1.         SIP代理向SIP服务器发送REGISTER请求: 2.         SIP服务器向SIP代理发送响应401,并在响应的消息头WWW ...

  5. MyBatis从入门到放弃三:一对一关联查询

    前言 简单来说在mybatis.xml中实现关联查询实在是有些麻烦,正是因为起框架本质是实现orm的半自动化. 那么mybatis实现一对一的关联查询则是使用association属性和resultM ...

  6. [转]基于boot2docker部署Docker环境

    本文转自:https://www.cnblogs.com/52fhy/p/8413029.html Docker轻量级的特性使得我们可以快速打包开发环境:一处编译,到处使用.我们可以在第一次编译好需要 ...

  7. 后台MemoryStream图片流用ajax接收乱码问题

    MemoryStream ms = new MemoryStream(); //要先把二进制流进行编码,再传输,解决乱码问题 Convert.ToBase64String(ms.ToArray()); ...

  8. 服务器CPU居高不下--解决问题历程

    基本的概述 在一个服务器的集群上面,服务器的CPU长时间居高不下,响应的时间也一直很慢,即使扩容了服务器CPU的下降效果也不是很明显. 对于CPU过高的原因,可以总结到以下原因: 太多的循环或者死循环 ...

  9. ASP.NET WebAPI 集成 Swagger 启用 OAuth 2.0 配置问题

    在 ASP.NET WebAPI 集成 Swagger 后,由于接口使用了 IdentityServer 做的认证,调试起来很不方便:看了下 Swashbuckle 的文档 ,是支持 OAuth2.0 ...

  10. url字符长度限制解决办法

    前段时间,同事往系统上传相关文档,发现输入失败,找到了我了. 开始以为数据库字段属性问题,修改后未解决随调试系统,发现没有走到后台程序,发现 ajax没有传值,各种测试问题情况,后来同事发现是url字 ...