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

在ASP.NET MVC中如何筛选DISTINCT日期?

解决ASP.NET MVC中EF查询日期去重无效的问题

你遇到的问题核心是EF的Distinct()方法和SQL的DISTINCT逻辑不一致:

  • SQL里的SELECT DISTINCT date只针对date字段做去重判断,只要日期相同就会合并;
  • 而EF中直接对STATISTICS_DAILY实体调用Distinct(),是对比整个实体的所有属性,只要有一个字段值不同(比如时间部分、其他业务字段),就会被判定为不同记录,所以无法实现日期去重。

下面提供两种可行的解决方法:

方法1:仅提取日期字段去重(适合只需要日期列表的场景)

直接投影出日期部分并去重,逻辑和SQL完全一致:

public ActionResult Index() 
{
    int HospitalId = Convert.ToInt32(Session["HospitalID"]);
    // 提取日期部分并去重,按日期排序
    var distinctDates = db.STATISTICS_DAILY
        .Where(x => x.hospital_no == HospitalId)
        .Select(x => x.DATE.Date) // 只保留日期部分,忽略时间
        .Distinct()
        .OrderBy(date => date)
        .ToList();
    
    // 直接将去重后的日期列表传给视图
    return View(distinctDates);
}

如果视图需要完整的实体数据,可以基于去重后的日期再查询:

// 先获取去重日期
var distinctDates = db.STATISTICS_DAILY
    .Where(x => x.hospital_no == HospitalId)
    .Select(x => x.DATE.Date)
    .Distinct()
    .ToList();

// 根据日期过滤实体,每个日期保留所有记录(或按需取第一条)
var dailyData = db.STATISTICS_DAILY
    .Where(x => x.hospital_no == HospitalId && distinctDates.Contains(x.DATE.Date))
    .OrderBy(x => x.DATE)
    .ToList();

方法2:按日期分组取单条记录(需要完整实体的场景)

通过GroupBy按日期分组,然后取每组的第一条记录,实现每个日期只保留一条数据:

public ActionResult Index() 
{
    int HospitalId = Convert.ToInt32(Session["HospitalID"]);
    var sTATISTICS_DAILY = db.STATISTICS_DAILY
        .Where(x => x.hospital_no == HospitalId)
        .GroupBy(x => x.DATE.Date) // 按日期分组
        .Select(g => g.First()) // 取每组第一条记录
        .OrderBy(d => d.DATE)
        .ToList();
    
    return View(sTATISTICS_DAILY);
}

注意事项

  • 如果你的DATE字段是DateTime类型,一定要用.Date提取日期部分,否则同一天不同时间的记录会被视为不同;
  • 若使用GroupBy,g.First()可以替换为g.Last()或其他聚合逻辑,根据业务需求选择保留哪条记录。

内容的提问来源于stack exchange,提问作者Ziad Adnan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 21:52:50