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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:16:26