如何通过LINQ获取含符合条件Child的强类型Parent列表?
我明白你的问题了——你需要筛选出包含至少一个IsST=true的Child的Parent,同时每个保留的Parent只保留符合条件的Child,还要返回List<Parent>类型,而且因为类的属性太多,没法手动用Select new来重建对象。
你的现有代码问题出在Select直接返回了筛选后的ChildrenList,所以结果变成了List<List<Child>>,完全不符合预期。下面给你两种可行的解决方案,分别对应允许修改原数据和需要保留原数据的场景:
方案1:允许修改原Parent实例(简单直接)
如果你的业务场景允许修改原parentList中的Parent对象的ChildrenList,可以用这个方案:
List<Parent> parentFilteredList = parentList // 先过滤出至少有一个IsST=true的Child的Parent .Where(p => p.ChildrenList.Any(child => child.IsST)) // 对每个符合条件的Parent,更新其ChildrenList为仅包含符合条件的Child .Select(p => { p.ChildrenList = p.ChildrenList.Where(child => child.IsST).ToList(); return p; }) .ToList();
效果说明:
- 原
parentList中Id=3的Parent会被过滤掉(因为它的所有Child的IsST都是false) - Id=1的Parent的
ChildrenList保持不变(所有Child都符合条件) - Id=2的Parent的
ChildrenList会只剩下IdSub=4的那个Child
方案2:不修改原Parent实例(克隆对象)
如果需要保留原parentList中的对象不变,不想修改它们的ChildrenList,可以通过浅克隆Parent对象来实现,不用手动复制所有属性:
List<Parent> parentFilteredList = parentList .Where(p => p.ChildrenList.Any(child => child.IsST)) .Select(p => { // 浅克隆Parent,快速复制所有属性(包括值类型和引用类型的引用) Parent clonedParent = (Parent)p.MemberwiseClone(); // 替换克隆对象的ChildrenList为筛选后的结果,不影响原对象 clonedParent.ChildrenList = p.ChildrenList.Where(child => child.IsST).ToList(); return clonedParent; }) .ToList();
注意点:
MemberwiseClone()是浅克隆,如果Parent里有其他引用类型的属性(除了ChildrenList),克隆后的对象和原对象会共享这些引用。如果你的Parent只有值类型属性和ChildrenList,这个方法完全够用;如果有其他需要独立的引用类型属性,可能需要实现深克隆逻辑,但一般业务场景下浅克隆就足够了。
这两种方案都不需要手动写Select new Parent { ... }来复制大量属性,完美符合你的需求。
内容的提问来源于stack exchange,提问作者asd123ea
相关产品推荐
相关产品推荐

