You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 15:00:15