在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
相关产品推荐
相关产品推荐

