簡體   English   中英

如何通過LINQ和Lambda表達式過濾列表的導航屬性?

[英]How to filter navigation property of a list by LINQ and Lambda expression?

我有一個FirstLevelItem的列表。 每個項目都有一個SecondLevelItem列表。

public class FirstLevelItem {
    public List<SecondLevelItem> SecondLevelItems { get; set; }
}

public class SecondLevelItem{
    public bool Deleted {get; set;}
}

我想返回所有的FirstLevelItem並過濾SecondLevelItem

我了解您有一個本地集合,並且想要過濾未從每個元素中刪除的項目。 在這種情況下,您可以使用以下方法:

items.ForEach( item => 
   item.SecondLevelItems = item.SecondLevelItems.Where(s => !s.Deleted).ToList() );

或者,如果您正在談論數據庫,則可以執行以下操作:

var results = DataContext.FirstLevelItems.Select( fi => new { 
      FirstLevelItem = fi, 
      SecondLevelItems = fi.SecondLevelItems.Where( si => !si.Deleted ) 
} );

這將返回元組,其中FirstLevelItem屬性是第一級項目本身,而SecondLevelItems屬性是第二級項目的過濾列表。 但是,請確保直接訪問SecondLevelItems屬性,而不是FirstLevelItem.SecondLevelItems屬性,因為這將懶惰地評估和查詢數據庫中所有第二級項目。

有趣的是每個人對問題的理解不同:-)。

返回所有包含至少一個被刪除的SecondLevelItem FirstLevelItem

var result = DbContext.FirstLevelItems
    .Where(fl => fl.SecondLevelItems.Any(sl => sl.Deleted));

Any子句檢查集合中至少一項的布爾條件是否為true。

假設您具有類型為List<FirstLevelItem>變量list

list = list.Select(listItem =>
{
    listItem.SecondLevelItems = listItem
        .SecondLevelItems
        .Where(secondLevelItem => secondLevelItem.Deleted)
        .ToList();
    return listItem;
}).ToList();

此代碼可能會幫助您

 var fli = //get your FirstLevelItems
       var result= fli.SecondLevelItems.Where(x => x.Deleted);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM