public static List <NodeModel> GetAccessByRole(int?roleId) { List <NodeModel> nodeList = NodeModel.Fetch("where Title like '%后台%' and Pid = '0' order by Id asc "); List <NodeModel> allList = new List <NodeModel>(); foreach (var rootNode in nodeList) { List <NodeModel> list = new List <NodeModel>(); string strSql = string.Format(@"select distinct Node.id as Id, Node.Pid as Pid, Node.Name as Name, Node.Title as Title, Node.SortNo as SortNO, Node.NodeLevel as NodeLevel, Node.GroupId as GroupID, case(select count(*) from Access where Access.roleid = {0} and Node.id = Access.nodeid) when 0 then 'false' else 'true' end as 'IsChecked' from Node left join Access on Node.id = Access.nodeid where Node.Area = {1} order by Node.SortNo asc", roleId, rootNode.ID); list = NodeModel.Fetch(strSql); List <GroupModel> groupList = GroupModel.Fetch("where DelFlag = 0 order by SortNo asc"); foreach (var node in list) { if (node.Pid.ToInt() == rootNode.ID.ToInt()) { var group = groupList.FirstOrDefault(s => s.ID.ToInt() == node.GroupID); if (group == null) { continue; } group.HasUsed = true; node.Pid = "g_" + group.ID; } } foreach (var groupModel in groupList) { if (!groupModel.HasUsed) { continue; } NodeModel node = new NodeModel(); node.ID = "g_" + groupModel.ID; node.Name = groupModel.Name; node.Title = groupModel.Title; node.Pid = rootNode.ID; node.nocheck = "false"; list.Add(node); } allList.AddRange(list); } return(allList); }