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. 解决步骤
- 检查数据库表结构,确保
Modified列是datetime/datetime2类型; - 查看EF Core生成的SQL,确认ORDER BY是否存在;
- 禁用客户端评估,排查是否存在无法转换的查询逻辑;
- 直接在数据库执行SQL,验证排序结果是否正确。
内容的提问来源于stack exchange,提问作者falowil
相关产品推荐
相关产品推荐

