c#所有部門及其下所部門生成樹形圖(遞歸算法獲取或鍵值對方式獲取)


部門數據庫的設計:

代碼:

        /// <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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM