asp.net mvc简单LINQ语句与列表中的列表有关的问题

时间:2016-05-23 00:55:46

标签: asp.net asp.net-mvc linq

我使用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 ...

2 个答案:

答案 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")
});