基于属性值过滤LINQ列表并过滤属性

3
我的NavigationItem有一个导航属性NavigationItemsPermissions,其中我有RoleId。在函数的输入参数中,我有一个List<int> roleIds,其中我将拥有类似{1, 3}的内容。
如何完成我的LINQ,以便返回具有输入列表中某些RoleIdNavigationItem(s)。 请注意,此外,我只想要那些具有来自输入列表的RoleIdNavigationItemsPermissions
以下是我卡住的地方。
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#"] }]

真实数据示例:

在此输入图片描述

在此输入图片描述

感谢任何帮助。

2个回答

5
这应该可以帮助您获得想要的结果。
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,其中 NavigationItemsPermissions.RoleId 在 roleIds 中”,则可以使用此查询。

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()
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());

x.NavigationItemsPermissions.Any(r => roleIds.Contains(r.RoleId)) 给出了所有那些 NavigationItems,其中 任意一个 NavigationItemsPermissionsroleIds 中。你想要的是 NavigationItems所有NavigationItemsPermissions 都在 roleIds 中吗? - Arghya C
我需要所有NavigationItems,它们按照目前的过滤方式进行过滤,但我只需要NavigationItemsPermissions,其中NavigationItemsPermissions.RoleId在roleIds中。 - azza idz
我已经在帖子中添加了额外的图片,希望能有所帮助。 - azza idz
虽然我仍然不确定你在这里期望什么,但看看编辑后的答案是否能帮到你? - Arghya C
1
如果我理解您的要求,Edit-2 应该适合您。请确认一下。 - Arghya C
显示剩余3条评论

3

在这种情况下,您可以使用 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;
    }

这不会起作用,因为x.RoleId在NavigationItemsPermissions中而不是NavigationItem中。 - azza idz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接