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

EFCore中OrderByDescending按DateTime排序异常问题求助

EF Core按DateTime排序结果混乱问题排查

我正在使用EF Core,尝试从数据库中获取按DateTime顺序排序的实体。实体类定义如下,我查阅资料发现其他用户曾因将日期存为字符串出现问题,但我在数据库和C#中均使用DateTime类型。

public class MyEntity
{
  public int Id {get; set;}
  public int OwnerId {get;set;}
  public DateTime Modified {get;set;}
}

public IQueryable<MyEntity> Get(Expression<Func<MyEntity, bool>> expression) => _context.MyEntity.Where(expression);

List<MyEntity> myEntities = Get(x=> x.OwnerId == user.Id).OrderByDescending(x=> x.Modified).ToList();

但得到的列表排序混乱:

Modified= {1753-01-01 00:00:00} <--- 从1753年直接跳到2022-09-13,我怀疑1753年是否有特殊之处?
Modified= {2022-09-13 18:46:47} 
Modified= {2022-08-16 11:14:49} 
Modified= {2022-08-02 08:13:16} 
Modified= {2022-08-02 08:21:52} <- 时间顺序错误,似乎是随机排序?我猜测OrderByDescending是否无法处理时间?
Modified= {2022-08-02 08:58:30} 
Modified= {2022-08-02 09:13:07} 
Modified= {2022-08-02 11:15:30} 
Modified= {2022-08-02 11:50:43} 
Modified= {2022-08-01 07:05:52} 
Modified= {2022-08-01 12:52:09} 
Modified= {2022-08-01 13:38:59} 
Modified= {2022-07-20 18:56:32} 
Modified= {2022-07-14 10:53:09} < ... 从07-20到07-14再到07-18,我完全困惑了,这既不是1753年的问题,也不是时间问题,而是日期乱序?原因是什么?
Modified= {2022-07-18 15:00:02} 
Modified= {2022-07-17 14:28:52} 
Modified= {2022-07-15 15:13:53} 
Modified= {2022-07-15 15:03:47} 
Modified= {2022-07-15 13:39:31} 
Modified= {2022-07-15 12:37:53} 
Modified= {2022-07-15 13:45:41} 
Modified= {2022-07-15 12:39:37} 
Modified= {2022-04-08 08:05:22} 
Modified= {2022-04-04 08:53:45} 
Modified= {2022-04-04 08:34:12} 
Modified= {2022-04-04 13:19:56} 
Modified= {2022-04-04 14:16:25} 
Modified= {2022-04-04 14:37:36} 
Modified= {2022-04-01 13:48:00} 
Modified= {2022-04-01 12:44:28} 
Modified= {2022-04-01 11:58:12} 
Modified= {2022-03-17 09:22:58}  <--- 从03-17到03-18又回到03-17?
Modified= {2022-03-18 10:01:55} 
Modified= {2022-03-17 10:06:29} 
Modified= {2022-03-15 08:50:03} 
Modified= {2022-03-15 11:08:19} 
Modified= {2022-03-14 15:49:48} 

请问这是什么原因?我哪里操作错了?


问题分析与解决

1. 关于1753-01-01的特殊说明

这个日期是SQL Server中datetime类型的最小取值下限(datetime类型支持范围为1753-01-01 00:00:00至9999-12-31 23:59:59.997),出现该值通常意味着对应数据的Modified字段未被正确赋值,使用了数据库默认值。

2. 排序混乱的核心原因

排序结果混乱本质是排序逻辑未在数据库层面生效,或数据库字段类型不符合预期,具体排查方向:

  • 检查数据库字段类型:确认数据库中Modified列类型为datetime或datetime2,而非字符串(varchar/nvarchar)。若为字符串类型,即便C#使用DateTime,EF Core映射错误会导致按字符串规则排序,出现乱序。
  • 验证EF Core生成的SQL:开启EF Core日志,查看最终生成的SQL是否包含ORDER BY Modified DESC。若没有,说明查询被强制转为客户端评估(数据先全量拉取到内存,再在内存排序),通常是Get方法的Where表达式包含EF Core无法转换为SQL的逻辑。
  • 直接在数据库执行SQL:若生成的SQL包含ORDER BY,直接在数据库执行该SQL,查看返回结果是否排序正确。若数据库端结果正确,问题出在EF Core的数据映射或读取阶段;若数据库端结果也乱,大概率是数据库字段类型错误或数据本身异常。
  • 排查客户端评估:可通过EF Core配置禁用客户端评估(抛出异常),快速定位是否存在无法转换的表达式:
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder
            .UseSqlServer("你的连接字符串")
            .ConfigureWarnings(warnings => warnings.Throw(RelationalEventId.QueryClientEvaluationWarning));
    }
    

3. 解决步骤

  1. 检查数据库表结构,确保Modified列是datetime/datetime2类型;
  2. 查看EF Core生成的SQL,确认ORDER BY是否存在;
  3. 禁用客户端评估,排查是否存在无法转换的查询逻辑;
  4. 直接在数据库执行SQL,验证排序结果是否正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:01:07