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

Linq to Sql自连接分组查询:按MachineId聚合机器版本与详情

修正Linq to Sql分组查询逻辑

现有实体类

public class MachineUpdate
{
    public int MachineUpdateId { get; set;}
    public int MachineId { get; set;}
    public string MachineName { get; set; }
    public DateTime PublishDate { get; set; }
    public string PublishedBy { get; set; }
    public bool IsCorrect { get; set; }
    public decimal Version { get; set; }
}

public class DetailedMachine
{
    public int DetailedMachineId { get; set;}
    public int MachineUpdateId { get; set;}
    public string ConfigurationInfo { get; set; }
}

业务关系与数据示例

  • 每台机器对应多个版本更新记录,每个更新可关联多条详情数据。

MachineUpdate表数据

MachineUpdateIdMachineIdMachineNamePublishDatePublishedByVersionIsCorrect
11machine112/01/2022user11.001
21machine112/02/2022user11.011
32machine215/01/2022user21.001

DetailedMachine表数据

DetailedMachineIdMachineUpdateIdConfigurationInfo
11blah blah got changed
21blah blah got changed

目标输出结构

需按MachineId分组生成List<MachineData>集合,预期结果为2条记录(对应machine1和machine2):

public class MachineData
{
    public int MachineUpdateId { get; set;}
    public string PublishedBy { get; set; }
    public int VersionCount { get; set; }
    public List<Version> Versions { get; set; }
    public List<DetailedMachine> DetailedMachine { get; set; }
}

public class Version
{
    public int MachineUpdateId { get; set;}
    public string MachineName { get; set; }
    public DateTime PublishDate { get; set; }
    public string PublishedBy { get; set; }
    public decimal Version { get; set; }
}

原查询问题

原查询未按MachineId分组,而是遍历每条MachineUpdate生成MachineData,导致结果重复;VersionCount未赋值;DetailedMachine仅关联当前单条MachineUpdate的详情,不符合按机器汇总的需求。

修正后的查询逻辑

// 按MachineId分组,筛选有效更新记录
var groupedData = from mu in _dbContext.MachineUpdate
                  where mu.IsCorrect
                  group mu by mu.MachineId into machineGroup
                  select new
                  {
                      MachineId = machineGroup.Key,
                      AllUpdates = machineGroup.ToList()
                  };

// 转换为目标结构并关联详情数据
var result = (from groupItem in groupedData
              // 取该机器第一条更新的公共字段,若需最新更新可改为OrderByDescending(p => p.PublishDate).First()
              let firstUpdate = groupItem.AllUpdates.First()
              select new MachineData
              {
                  MachineUpdateId = firstUpdate.MachineUpdateId,
                  PublishedBy = firstUpdate.PublishedBy,
                  VersionCount = groupItem.AllUpdates.Count,
                  Versions = groupItem.AllUpdates.Select(v => new Version
                  {
                      MachineUpdateId = v.MachineUpdateId,
                      MachineName = v.MachineName,
                      PublishDate = v.PublishDate,
                      PublishedBy = v.PublishedBy,
                      Version = v.Version
                  }).ToList(),
                  DetailedMachine = (from dm in _dbContext.DetailedMachine
                                     join mu in groupItem.AllUpdates on dm.MachineUpdateId equals mu.MachineUpdateId
                                     select new DetailedMachine
                                     {
                                         MachineUpdateId = dm.MachineUpdateId,
                                         ConfigurationInfo = dm.ConfigurationInfo
                                     }).ToList()
              }).ToList();

关键修正点

  1. 按MachineId分组:通过group mu by mu.MachineId实现机器维度的汇总,确保每个机器对应一条MachineData。
  2. VersionCount赋值:直接取分组内更新记录的数量groupItem.AllUpdates.Count。
  3. 关联全量详情:通过分组内所有MachineUpdateId关联DetailedMachine,获取该机器所有更新对应的详情数据。
  4. 公共字段取值:取分组内第一条更新的标识与发布人信息,可根据业务需求调整为最新更新的字段。

内容的提问来源于stack exchange,提问作者csharpnewbie programmer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:25:39