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

多分组含子项求和:EF中按Course和Site分组汇总Dose的查询问题

需求实现方案

这个需求完全可以实现,核心是通过多表关联+多级分组+聚合函数来完成,以下是基于Entity Framework的具体解决方案:

前提假设(基于常见业务表结构)

假设你的表结构如下:

  • Radiation表:包含CourseId(课程ID)、CourseName(课程名称)、SiteId(部位ID)、Dose(剂量)字段
  • RadiationSites表:包含SiteId(部位ID)、SiteName(部位名称)字段
    两表通过SiteId建立关联关系。

解决方案代码

方式1:LINQ 查询语法

var groupedResult = from radiation in dbContext.Radiation
                    join site in dbContext.RadiationSites 
                        on radiation.SiteId equals site.SiteId
                    // 按课程(唯一ID+名称)、部位(唯一ID+名称)组合分组
                    group new { radiation, site } by new 
                    {
                        radiation.CourseId,
                        radiation.CourseName,
                        site.SiteId,
                        site.SiteName
                    } into groupedData
                    select new 
                    {
                        CourseName = groupedData.Key.CourseName,
                        SiteName = groupedData.Key.SiteName,
                        TotalDose = groupedData.Sum(item => item.radiation.Dose)
                    };

方式2:LINQ 方法语法

var groupedResult = dbContext.Radiation
    .Join(dbContext.RadiationSites,
          radiation => radiation.SiteId,
          site => site.SiteId,
          (radiation, site) => new { radiation, site })
    .GroupBy(item => new 
    {
        item.radiation.CourseId,
        item.radiation.CourseName,
        item.site.SiteId,
        item.site.SiteName
    })
    .Select(groupedData => new 
    {
        CourseName = groupedData.Key.CourseName,
        SiteName = groupedData.Key.SiteName,
        TotalDose = groupedData.Sum(item => item.radiation.Dose)
    });

关键注意点(解决你之前代码未达预期的可能原因)

  • 分组键需包含唯一标识:不能仅用CourseName或SiteName分组,必须加入CourseId和SiteId,避免同名课程/部位被错误合并。
  • 确保表关联逻辑正确:必须通过SiteId完成两表关联,否则会出现数据不匹配或笛卡尔积问题。
  • 聚合字段引用准确:汇总剂量时要明确指向Radiation表的Dose字段,避免字段引用错误。

扩展场景:若CourseName不在Radiation表中

如果CourseName存储在独立的Course表(包含CourseId、CourseName),需额外关联该表:

var groupedResult = from radiation in dbContext.Radiation
                    join course in dbContext.Course 
                        on radiation.CourseId equals course.CourseId
                    join site in dbContext.RadiationSites 
                        on radiation.SiteId equals site.SiteId
                    group new { radiation, course, site } by new 
                    {
                        course.CourseId,
                        course.CourseName,
                        site.SiteId,
                        site.SiteName
                    } into groupedData
                    select new 
                    {
                        CourseName = groupedData.Key.CourseName,
                        SiteName = groupedData.Key.SiteName,
                        TotalDose = groupedData.Sum(item => item.radiation.Dose)
                    };

内容的提问来源于stack exchange,提问作者Tim Long

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:17:36