多分组含子项求和: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
相关产品推荐
相关产品推荐

