从EF6迁移到EF Core时如何替换DbFunctions.TruncateTime方法
EF6迁移EF Core时TruncateTime日期比较逻辑的替换方案
EF Core 从3.0版本开始(含.NET 6配套的EF Core 6),已经移除了EF6专属的DbFunctions.TruncateTime方法,你可以根据场景选择以下两种兼容写法,实现和原代码完全一致的查询逻辑:
推荐写法:范围比较(性能最优)
不需要对日期字段做截断,直接通过时间范围圈定目标日期的所有数据,EF Core可直接翻译为SQL范围查询,能命中DateTimeCreated字段的索引,大数据量场景下性能远高于函数截断写法:
var targetDate = statCalcDefinitionDateTime.Date; var nextDay = targetDate.AddDays(1); var result = db.Tickets .Where(x => x.DateTimeCreated >= targetDate && x.DateTimeCreated < nextDay) .ToList();
注意这里上边界用的是
< nextDay而不是<= nextDay,可以完美兼容带毫秒、微秒精度的datetime/datetime2类型,不会漏掉当天最后一刻的数据,也不会把次日0点的数据误算进来。
结构最贴近原代码的写法:直接使用DateTime.Date属性
EF Core已经原生支持对DateTime类型的.Date属性做SQL翻译,会自动生成对应数据库的日期截断逻辑,写法和原EF6代码结构几乎一致:
var result = db.Tickets .Where(x => x.DateTimeCreated.Date == statCalcDefinitionDateTime.Date) .ToList();
注意:这种写法会在生成的SQL中对DateTimeCreated字段调用日期截断函数,无法命中字段上的普通索引,仅适合数据量小、对查询性能要求不高的场景。
避坑提示
不要手动拆分年、月、日分别做相等判断,这种写法在不同数据库(SQL Server/MySQL/PostgreSQL)下的翻译行为不一致,还容易触发时区转换的隐性bug。
内容的提问来源于stack exchange,提问作者BoMerican
相关产品推荐
相关产品推荐

