如何通过LINQ和Lambda表达式过滤列表的导航属性?

时间:2018-02-13 08:35:23

标签: c# linq lambda

我有FirstLevelItem的列表。每个项目都有一个SecondLevelItem s列表。

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

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

我想返回已删除的所有FirstLevelItem和过滤SecondLevelItem

4 个答案:

答案 0 :(得分:3)

我知道您有一个本地集合,并且您希望过滤未从每个元素中删除的项目。在这种情况下,您可以使用:

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属性,因为懒惰地评估和查询数据库中的所有二级项目。

有趣的是,每个人都不同地理解这个问题:-)。

答案 1 :(得分:0)

返回包含至少一个已删除的FirstLevelItem的所有SecondLevelItem

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

Any子句检查集合中至少一个项的布尔条件是否为真。

答案 2 :(得分:0)

假设您有list类型的变量List<FirstLevelItem>

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

答案 3 :(得分:0)

此代码可能会帮助您

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