通过LINQ从孙集合获取带层级结构的祖父集合问题
用LINQ从孙集合生成祖父对象集合的解决方案
嘿,我明白你遇到的问题了——想通过LINQ从孙对象集合里得到完整的GrandParentBLL对象集合,之前按祖父名称分组只拿到了字符串,对吧?我来给你捋捋可行的方案,先假设你的对象结构大概是这样(补全你没给出的关联部分,方便理解):
public class Parent { public int ID { get; set; } public GrandParentBLL GrandParent { get; set; } // 父指向祖父的导航属性 public List<Child> Children { get; set; } // 子集合(也就是你的孙对象) } public class Child { public int ID { get; set; } public Parent Parent { get; set; } // 孙指向父的导航属性 }
场景1:获取去重后的祖父对象集合
如果你的孙集合里可能重复对应同一个祖父,想要得到每个祖父只出现一次的集合,可以这么写:
// 假设你有孙对象集合:List<Child> childrenList var grandParents = childrenList .Select(child => child.Parent.GrandParent) // 从孙一路导航到祖父 .Distinct() // 去重,注意:如果GrandParentBLL没重写Equals和GetHashCode,默认是按引用比较,可能需要按ID去重 .ToList(); // 按ID去重的版本(更稳妥,避免引用比较的问题) var grandParentsById = childrenList .Select(child => child.Parent.GrandParent) .GroupBy(gp => gp.ID) .Select(group => group.First()) // 每个ID组取第一个祖父对象 .ToList();
场景2:还原完整的层级结构(祖父+关联的父和孙)
如果你不仅要祖父对象,还要把对应的父、孙也关联回去,还原完整的层级,可以用分组+构造的方式:
var grandParentsWithHierarchy = childrenList .GroupBy(child => child.Parent.GrandParent.ID) // 按祖父ID分组 .Select(group => { // 拿到当前组对应的祖父对象(取第一个就行,同ID是同一个祖父) var grandParent = group.First().Parent.GrandParent; // 整理当前祖父下的父集合:按父ID分组,把孙集合关联到对应父 var parents = group.GroupBy(child => child.Parent.ID) .Select(parentGroup => { var parent = parentGroup.First().Parent; parent.Children = parentGroup.ToList(); // 把当前组的孙赋值给父的Children属性 return parent; }) .ToList(); grandParent.Parents = parents; // 把整理好的父集合赋值给祖父 return grandParent; }) .ToList();
为什么之前按名称分组只得到字符串?
你之前应该是写了类似GroupBy(child => child.Parent.GrandParent.Name)这样的代码,这样分组的键是字符串类型,如果后续只提取分组键的话,自然只能得到祖父名称的字符串集合。要拿到完整的祖父对象,得把分组键设为祖父对象本身或者它的唯一标识(比如ID),再从分组中提取对应的祖父对象。
另外提醒一句:如果你的导航属性可能为null,记得加上空值判断,比如用?.操作符避免空引用异常,比如child.Parent?.GrandParent。
内容的提问来源于stack exchange,提问作者Josip Skopljak
相关产品推荐
相关产品推荐

