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

Entity Framework中按年月筛选数据库记录的问题求助

解决按年月筛选数据库记录返回空结果的问题

看起来你遇到的核心问题是直接用DateTime对象相等来匹配年月,这在大多数情况下都不会生效,因为数据库里的Data字段是包含具体日期和时间的完整时间戳,而你传入的homeVM.Mese只是一个代表当月第一天0点的DateTime值,两者不可能相等。下面是具体的解决步骤和修改后的代码:

问题根源分析

你的代码里用了m.Data == month来筛选,但month的值是类似2024-05-01 00:00:00这样的日期(因为DisplayFormat只是显示格式,实际DateTime对象还是包含完整的日期时间),而数据库中的m.Data是每条记录的具体插入时间(比如2024-05-12 14:30:00),所以这个相等判断永远为假,返回空结果。

解决方案:匹配年份和月份而非完整DateTime

我们需要从传入的DateTime中提取年份和月份,然后分别匹配数据库中Data字段的年份和月份,同时还要确保tecnico的获取是正确的。

修改后的代码

public IActionResult Search(HomeVM homeVM) {
    // 先获取技术人员的姓名,增加空值检查避免后续无效查询
    var tecnico = _db.Tecnici
        .Where(m => m.Id == homeVM.Attivita.Tecnico)
        .Select(m => $"{m.Surname} {m.Name}")
        .FirstOrDefault();

    if (string.IsNullOrEmpty(tecnico)) {
        // 如果找不到对应的技术人员,直接返回空结果或提示
        return View(new List<VW_ATTIVITA_DAILY>());
    }

    // 提取目标年份和月份
    var targetYear = homeVM.Mese.Year;
    var targetMonth = homeVM.Mese.Month;

    // 正确筛选:匹配年份和月份,而非完整DateTime
    var result = _db.VW_ATTIVITA_DAILY
        .Where(m => m.Data.Year == targetYear 
                 && m.Data.Month == targetMonth 
                 && m.Tecnico == tecnico)
        .ToList();

    // 记得返回结果到视图(原代码缺少返回语句)
    return View(result);
}

额外注意事项

  • 检查技术人员姓名的一致性:确保Tecnici表返回的Surname + " " + Name格式和VW_ATTIVITA_DAILY表中Tecnico字段的格式完全一致(比如有没有大小写差异、多余空格等),这也可能导致筛选不到结果。
  • EF版本兼容:如果使用的是较旧的EF版本,可能需要用DbFunctions.TruncateTime(m.Data)来截断时间后再处理,但直接匹配Year和Month是最通用且高效的方式。
  • 时区问题:如果数据库中的时间是UTC时间,而你传入的是本地时间,需要先统一时区再进行筛选,避免跨月份的错误(比如UTC时间的5月1日0点是本地时间的4月30日晚上)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:47:53