繁体   English   中英

基于属性值的LINQ筛选器列表并也筛选属性

[英]LINQ filter list based on property value and filter the properties as well

我的NavigationItem具有导航属性NavigationItemsPermissions ,其中我具有RoleId 作为函数中的输入参数,我具有List<int> roleIds ,其中将有类似{1,3}的内容。

我如何完成我的LINQ给我回NavigationItem (s)表示,有NavigationItemsPermissions 一些 RoleId输入列表中。 请注意 ,此外,我只需要输入列表中带有RoleId那些NavigationItemsPermissions

这是我坚持的地方

public List<NavigationItem> GetNavigationItems(MenuType menuType, List<int> roleIds)
{
    var navigationItems = DbContext.NavigationItems.Where(x => x.MenuTypeId == (int) menuType && !x.IsDeleted && x.NavigationItemsPermissions.Any(r=>r.RoleId **in roleIds**)));       

    return navigationItems;
}

如果有开发人员列表,则给出一个简单的类比(不是真实数据)

developers: [
    { name: "Hickory", skills: ["c#", "js", "linq"] }
    { name: "Dickory", skills: ["html", "css", "js"] }
    { name: "Dock", skills: ["html", "c#", "oracle"] }
]

和给定的技能list = [ "c#", "linq" ] ,我希望得到以下结果

[{ name: "Hickory", skills: ["c#", "linq"] }
{ name: "Dock", skills: ["c#"] }]

实际数据样本:

在此处输入图片说明

在此处输入图片说明

感谢您的任何帮助。

在这种情况下,您可以使用contains

public List<NavigationItem> GetNavigationItems(MenuType menuType, List<int> roleIds)
    {
        var navigationItems = DbContext.NavigationItems.Where(x => x.MenuTypeId == (int) menuType && !x.IsDeleted && roleIds.contains(x.RoleId)));


        return navigationItems;
    }

这应该给您想要的结果

public List<NavigationItem> GetNavigationItems(MenuType menuType, List<int> roleIds)
{
    var navigationItems = DbContext.NavigationItems
                                        .Where(x => x.MenuTypeId == (int) menuType && 
                                                !x.IsDeleted && 
                                                x.NavigationItemsPermissions.Any(r => roleIds.Contains(r.RoleId)));
    return navigationItems;
}

编辑

如果“仅需要NavigationItemsPermissions.RoleId在roleIds中的NavigationItemsPermissions” ,则可以使用此查询

var navigationPermissions = DbContext.NavigationItems
                                    .Where(x => x.MenuTypeId == (int) menuType && 
                                            !x.IsDeleted)
                                    .SelectMany(ni => ni.NavigationItemsPermissions)
                                    .Where(np => roleIds.Contains(np.RoleId))
                                    .ToList();

如果有重复的项目并且只需要不同的项目,请在ToList() Distinct()之前使用Distinct()

编辑2

var navigationItems = DbContext.NavigationItems
                                    .Where(x => x.MenuTypeId == (int) menuType && 
                                            !x.IsDeleted && 
                                            x.NavigationItemsPermissions.Any(r => roleIds.Contains(r.RoleId)));     
navigationItems.ForEach(x => x.NavigationItemsPermissions = x.NavigationItemsPermissions.Where(r => roleIds.Contains(r.RoleId)).ToList());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM