有啥补充请大神们在下面留言:
//反向递归 找到最低层的菜单一步步往上查 (先逆向递归然后再反向递归)
[HttpPost]
public ReturnNode MenuListByAdd(GetMenuListInput input){
/反向递归,从最底层menu找上面所有的menu
var allList = dbContext.yf_menu.AsQueryable().ToList();
string sql = "select * from yf_menu as d where d.Id in(select menuid from yf_action as c where c.id in(select a.actionid from yf_role_action as a where a.roleid = 2) GROUP BY menuid); ";
var bottomList = dbContext.Database.SqlQuery<yf_menu>(sql).ToList();
List<yf_menu> newList = new List<yf_menu>();
foreach (yf_menu node in bottomList)
{
newList.Add(node);
newList.AddRange(GetParentMenuList(node, allList));
}
var list = newList.Where((x, i) => newList.FindIndex(z => z.id == x.id) == i);//数组去重
///************************
string actionSql = string.Format("SELECT a.*,r.roleid from yf_action a LEFT JOIN yf_role_action r on a.id=r.actionid and r.roleid={0}", input.roleId);
var actionList = dbContext.Database.SqlQuery<GetMenuListActionOutput>(actionSql).ToList();
var newlist = new List<GetMenuListOutput>();
foreach (yf_menu menu in list)
{
GetMenuListOutput newinput = new GetMenuListOutput();
newinput.createtime = menu.createtime;
newinput.id = menu.id;
newinput.menuname = menu.menuname;
newinput.menuurl = menu.menuurl;
newinput.note = menu.note;
newinput.parentid = menu.parentid;
newinput.actionList = actionList.Where(u => u.menuid == menu.id).OrderBy(p => p.id).ToList();
newlist.Add(newinput);
}
if (input.outDataType == 1)//树形
{
GetMenuListOutput tree = initMenuTree(newlist.Where(u => u.parentid == 0).FirstOrDefault(), newlist);
return ReturnNode.ReturnSuccess(tree);
}
else if (input.outDataType == 2)//数据字典
{
return ReturnNode.ReturnSuccess(newlist.ToDictionary(u => u.id));
}
else//数组
{
return ReturnNode.ReturnSuccess(newlist);
}
}
//递归找上级方法
//递归找上级
private List<yf_menu> GetParentMenuList(yf_menu menuNode, List<yf_menu> allList)
{
yf_menu parentNode = allList.Where(u => u.id == menuNode.parentid).FirstOrDefault();
List<yf_menu> newList = new List<yf_menu>();
newList.Add(parentNode);
if (parentNode.parentid != 0)
{
newList.AddRange(GetParentMenuList(parentNode, allList));
}
return newList;
}
==========正向递归
//生成树
private GetMenuListOutput initMenuTree(GetMenuListOutput menu, List<GetMenuListOutput> list)
{
var chirldens = list.Where(u => u.parentid == menu.id);
menu.childrens = new List<GetMenuListOutput>();
foreach (var node in chirldens)
{
var newnode = initMenuTree(node, list);
menu.childrens.Add(newnode);
}
return menu;
}