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()
。
编辑 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());
我的 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()
。
编辑 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());