我使用this Blog在asp.net-core MVC 6中整理了一个动态菜单。
我有一个menuItem对象,我希望根据两个条件选择对象的子集。这是菜单对象:
public class MenuItem
{
public int Id { get; set; }
public bool Divider { get; set; }
public bool Header { get; set; }
public string ActionName { get; set; }
public string ControllerName { get; set; }
public string MenuItemText { get; set; }
public IList<string> Roles { get; set; }
public int ParentId { get; set; }
public MenuItem()
{
}
public MenuItem(int id, bool divider, bool header, string action, string controller, string menuItemText, IList<string> roles,int parentid)
{
Id = id;
Divider = divider;
Header = header;
ActionName = action;
ControllerName = controller;
MenuItemText = menuItemText;
Roles = roles;
ParentId = parentid;
}
}
使用以下行填充这些项目的列表:
MenuList.MenuItems.Add(new MenuItem(100, false, false, "Index", "Scheduler", "Scheduling", new List<string>() { "Admin", "Technician" }, 0));
我可以使用此行选择基于ParentId的MenuItems,它可以工作:
_menuData.GetUnAuthorizedMenus().Result.MenuItems.Where(s => s.ParentId == parentId).ToList();
,特别是:
MenuItems.Where(s => s.ParentId == parentId).ToList();
如何选择ParentId == parentId和
的那些行角色==&#34;管理员&#34;。
在menuItem中有一个这个MenuItem所属的角色列表,我想根据它们是否在该列表中具有特定角色来选择这些项目。
如何仅选择子列表中具有特定角色的menuItem以及上述的ParentId ...
答案 0 :(得分:2)
这应该有效
MenuItems.Where(s => s.ParentId == parentId && s.Roles.Contains("Admin")).ToList();
或者
MenuItems.Where(s => s.ParentId == parentId && s.Roles.Count() == 1 && s.Roles.Contains("Admin")).ToList();
如果您想要只有 管理员角色的菜单项
答案 1 :(得分:1)
尝试这个它应该返回记录,其中Id =父id和子列表,其中role是admin。
menuItems.Where(x => x.Id == parentId).Where(z => z.Roles.Any(y => y == "Admin"));
如果您想过滤子列表,请使用
menuItems.Where(x => x.Id == parentId).select(child => new MenuItems
{
//Populate parent properties
Roles = child.Roles.Where(x=>x=="Admin")
});