部門數據庫的設計:
代碼:
/// <summary> /// 獲取部門(入口) /// </summary> /// <returns></returns> [HttpGet] [Route("GetDepart")] public ResultEntity<List<JieDian>> GetDepart() { ResultEntity<List<JieDian>> result = new ResultEntity<List<JieDian>>(); int? officeId = 0; try { officeId = new AuthInfo().GetOfficeId(User as ClaimsPrincipal); if (!officeId.HasValue) { result.IsSuccess = false; result.ErrorCode = 403; 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 = 500; 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 == 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() { 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 = 403; 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
