簡體   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