LINQ中多数据集多次GroupJoin实现及重复字段排除问题
LINQ多表关联与重复字段排除解决方案
1. 实现多GroupJoin关联SheetChildTwo
通过两次GroupJoin依次关联三层数据集,核心是依托关联字段ID匹配层级关系。假设你的数据源为List<SheetMain> mainList、List<SheetChildOne> childOneList、List<SheetChildTwo> childTwoList,代码示例如下:
var result = mainList.GroupJoin( childOneList, main => main.ID, childOne => childOne.ID, (main, childOnes) => new { MainData = main, ChildOnes = childOnes.GroupJoin( childTwoList, co => co.ID, ct => ct.ID, (co, childTwos) => new { // 仅保留SheetChildOne独有字段,跳过和SheetMain重复的ID、Floor ChildOneField1 = co.Field1, ChildOneField2 = co.Field2, // 关联SheetChildTwo,同样排除重复字段 ChildTwos = childTwos.Select(ct => new { ChildTwoFieldA = ct.FieldA, ChildTwoFieldB = ct.FieldB }) } ) }) .Select(item => new AllSheets { // 保留SheetMain完整字段 ID = item.MainData.ID, Floor = item.MainData.Floor, MainField1 = item.MainData.MainField1, MainField2 = item.MainData.MainField2, // 映射子集合到AllSheets实体 ChildOneList = item.ChildOnes.ToList() });
2. 排除父子类重复字段
核心思路是投影时仅选择子类独有的属性,不重复包含父类已存在的ID、Floor等字段:
- 处理
SheetChildOne时,只提取它特有的属性(如Field1、Field2),跳过与SheetMain重复的字段; - 处理
SheetChildTwo时同理,只保留自身独有的属性(如FieldA、FieldB),避免冗余。
如果AllSheets实体的子集合要求强类型而非匿名类,可以创建DTO剔除重复字段:
// 定义剔除重复字段的DTO public class SheetChildOneDTO { public string Field1 { get; set; } public int Field2 { get; set; } public List<SheetChildTwoDTO> ChildTwos { get; set; } } public class SheetChildTwoDTO { public string FieldA { get; set; } public DateTime FieldB { get; set; } } // LINQ中映射到DTO var result = mainList.GroupJoin( childOneList, main => main.ID, childOne => childOne.ID, (main, childOnes) => new AllSheets { ID = main.ID, Floor = main.Floor, MainField1 = main.MainField1, MainField2 = main.MainField2, ChildOneList = childOnes.GroupJoin( childTwoList, co => co.ID, ct => ct.ID, (co, childTwos) => new SheetChildOneDTO { Field1 = co.Field1, Field2 = co.Field2, ChildTwos = childTwos.Select(ct => new SheetChildTwoDTO { FieldA = ct.FieldA, FieldB = ct.FieldB }).ToList() }).ToList() });
注意事项
- 若
SheetChildTwo直接关联SheetMain而非SheetChildOne,只需调整第二次GroupJoin的关联字段为main.ID; - 确保关联字段类型一致,避免类型不匹配导致关联失败;
- 映射到
AllSheets时严格匹配实体属性名,避免赋值错误。
内容的提问来源于stack exchange,提问作者Bohn
相关产品推荐
相关产品推荐

