MVC5中通过LINQ按疾病类型分组月度患者数据求助
我来帮你搞定这个按疾病类型分组统计的需求!咱们一步步来调整代码:
1. 更新UserRange模型
首先得给UserRange新增一个存储疾病类型的属性,这样才能把疾病信息传递到视图层:
public class UserRange { public string AgeRange { get; set; } public int Count { get; set; } public string Gender { get; set; } // 新增疾病类型属性,用来存储疾病名称 public string DiseaseType { get; set; } // 你原来的grilsTotal、boysTotal如果没实际用到,建议清理掉减少冗余 }
2. 修改ShowPation ActionResult的查询逻辑
原来的查询只按年月、年龄组、性别分组,现在要把疾病类型加入分组条件,同时关联Type_disease表获取疾病名称:
public ActionResult ShowPation() { // 关联疾病表,把疾病类型加入分组逻辑 var query = from t in db.Pations // 用导航属性直接获取疾病名称(如果EF延迟加载正常的话),也可以用join写法 let diseaseName = t.Type_diseases.Namedisease let Agerange = (t.Age >= 0 && t.Age < 1) ? "Under year" : (t.Age >= 1 && t.Age < 5) ? "1 _ 4" : (t.Age >= 5 && t.Age < 15) ? "5 _ 14" : (t.Age >= 15 && t.Age < 25) ? "15 _ 24" : (t.Age >= 25 && t.Age < 45) ? "25 _ 44" : // 修正了你原来的24_44笔误 "over 45" let Gender = t.Sex == Sex.boys ? "boys" : "girls" // 分组条件新增疾病类型 group t by new { t.DateWared.Year, t.DateWared.Month, Agerange, Gender, DiseaseType = diseaseName } into g select new { Count = g.Count(), g.Key.Year, g.Key.Month, g.Key.Agerange, g.Key.Gender, g.Key.DiseaseType }; // 按「年月+疾病类型」层级分组,方便视图展示 var groupedData = from item in query group item by new { item.Year, item.Month } into monthGroup select new { MonthYearKey = $"{monthGroup.Key.Month}/{monthGroup.Key.Year}", DiseaseGroups = monthGroup.GroupBy(x => x.DiseaseType) }; // 转换成嵌套字典:年月 → 疾病类型 → 统计列表 Dictionary<string, Dictionary<string, List<UserRange>>> result = new(); foreach (var monthGroup in groupedData) { var monthKey = monthGroup.MonthYearKey; if (!result.ContainsKey(monthKey)) { result[monthKey] = new Dictionary<string, List<UserRange>>(); } foreach (var diseaseGroup in monthGroup.DiseaseGroups) { var diseaseKey = diseaseGroup.Key; result[monthKey][diseaseKey] = diseaseGroup.Select(x => new UserRange { Count = x.Count, AgeRange = x.Agerange, Gender = x.Gender, DiseaseType = x.DiseaseType }) .OrderByDescending(x => x.AgeRange) .ToList(); } } return View(result); }
这里的关键修改点:
- 加入了疾病类型的分组条件,确保统计数据按疾病拆分
- 用嵌套字典存储数据,层级更清晰:
年月→疾病类型→年龄组+性别+数量 - 简化了原来的多步查询逻辑,直接一步到位生成统计结果
3. 更新View代码展示疾病类型分组
现在ViewModel变成了嵌套字典,视图需要调整循环逻辑,先遍历年月,再遍历每个年月下的疾病类型:
@model Dictionary<string, Dictionary<string, List<The_Hospital_Project.Models.UserRange>>> <table border="1" class="table table-responsive table-bordered table-hover table-striped " style="height: 145px;text-align: center; border: solid 1px;border-radius: 5px;direction: rtl;"> @foreach (var monthEntry in Model) { var monthYear = monthEntry.Key; var diseaseGroups = monthEntry.Value; <!-- 年月标题行 --> <tr> <td colspan="@(diseaseGroups.Sum(d => d.Value.Count * 3))"> <center><strong>@monthYear</strong></center> </td> </tr> <!-- 遍历每个疾病类型的统计数据 --> foreach (var diseaseEntry in diseaseGroups) { var diseaseName = diseaseEntry.Key; var statsList = diseaseEntry.Value; <!-- 疾病类型标题行 --> <tr> <td colspan="@(statsList.Count * 3)"> @diseaseName </td> </tr> <!-- 年龄组行 --> <tr> @foreach (var item in statsList) { <td style="height: 57px;">@item.AgeRange</td> } </tr> <!-- 性别行 --> <tr> @foreach (var item in statsList) { <td>@item.Gender</td> } </tr> <!-- 患者数量行 --> <tr> @foreach (var item in statsList) { <td>@item.Count</td> } </tr> } } </table>
这样视图会先展示年月,然后在每个年月下按疾病类型拆分,依次显示对应疾病的年龄组、性别和统计数量。
额外小提示
- 如果EF延迟加载疾病数据有问题,可以在查询开头加上
.Include(t => t.Type_diseases)强制加载导航属性,比如:db.Pations.Include(t => t.Type_diseases) - 你可以根据实际需求调整年龄组的划分规则和排序逻辑
内容的提问来源于stack exchange,提问作者JMAL HASSN
相关产品推荐
相关产品推荐

