.NET Core 2.0中Entity Framework DateTime加时查询替代SqlFunctions方案咨询
在.NET Core 2.0 EF中实现DateTime加小时的查询
嘿,这个问题我之前在项目里也碰到过!.NET Core 2.0的EF Core确实移除了旧的SqlFunctions,不过有几个替代方案可以完美实现你的需求,我给你详细说说:
方法一:使用EF Core的DbFunctions.AddHours
EF Core专门提供了DbFunctions类来处理这类需要转换为SQL的数据库操作,其中就包含AddHours方法。使用前记得引用Microsoft.EntityFrameworkCore命名空间,它会自动把这个方法翻译成SQL的DATEADD语句。
示例代码:
using Microsoft.EntityFrameworkCore; // 假设你的实体是Order,包含DateTime类型的OrderTime属性 var query = _context.Orders .Where(o => DbFunctions.AddHours(o.OrderTime, 3) <= DateTime.Now) .Select(o => new { o.OrderId, o.OrderTime }); var results = await query.ToListAsync();
方法二:直接使用C#的DateTime.AddHours
EF Core 2.0已经支持将C#原生的DateTime.AddHours方法直接转换为对应的SQL语句,这种写法更简洁直观,不需要额外引用特殊类:
示例代码:
var query = _context.Orders .Where(o => o.OrderTime.AddHours(3) <= DateTime.Now) .Select(o => new { o.OrderId, o.OrderTime }); var results = await query.ToListAsync();
小贴士:这种写法在EF Core 2.0及以上版本都能正常工作,EF会自动把
AddHours翻译为SQL的DATEADD(HOUR, @hours, @date)。
方法三:原生SQL查询(特殊场景备用)
如果上面两种方法都不适合你的场景(比如复杂的自定义SQL逻辑),可以直接使用原生SQL查询:
示例代码:
int hoursToAdd = 3; var results = await _context.Orders .FromSql($"SELECT OrderId, OrderTime FROM Orders WHERE DATEADD(HOUR, {hoursToAdd}, OrderTime) <= GETDATE()") .ToListAsync();
注意:如果使用参数的话,建议用参数化查询避免SQL注入,比如通过
SqlParameter传递参数。
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

