简体   繁体   English

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

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

I have a list of FirstLevelItem s. 我有一个FirstLevelItem的列表。 Each item has a list of SecondLevelItem s. 每个项目都有一个SecondLevelItem列表。

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

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

I want to return all FirstLevelItem s and filter SecondLevelItem s which are Deleted. 我想返回所有的FirstLevelItem并过滤SecondLevelItem

I understand you have a local collection and you want to filter the items that are not deleted from each element. 我了解您有一个本地集合,并且想要过滤未从每个元素中删除的项目。 In such case you can use this: 在这种情况下,您可以使用以下方法:

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

Alternatively, if you are talking about a database, you could do: 或者,如果您正在谈论数据库,则可以执行以下操作:

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

This will return tuples where FirstLevelItem property is the first level item itself, and SecondLevelItems property is the filtered list of second level items. 这将返回元组,其中FirstLevelItem属性是第一级项目本身,而SecondLevelItems属性是第二级项目的过滤列表。 However, make sure you access the SecondLevelItems property directly, not the FirstLevelItem.SecondLevelItems property, as that would lazily evaluate and query the database for all second level items. 但是,请确保直接访问SecondLevelItems属性,而不是FirstLevelItem.SecondLevelItems属性,因为这将懒惰地评估和查询数据库中所有第二级项目。

It is interesting how everyone understood the problem differently :-) . 有趣的是每个人对问题的理解不同:-)。

Return all FirstLevelItem s that contain at least one SecondLevelItem that is deleted: 返回所有包含至少一个被删除的SecondLevelItem FirstLevelItem

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

The Any clause checks if a boolean condition is true for at least one item in a collection. Any子句检查集合中至少一项的布尔条件是否为true。

Suppose you have variable list of type List<FirstLevelItem> . 假设您具有类型为List<FirstLevelItem>变量list

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

this code maybe help you 此代码可能会帮助您

 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