[英]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.