LINQ to Entities中Where子句数值转日期运算报错的技术咨询
解决LINQ to Entities不支持AddHours方法的问题
LINQ to Entities无法将.NET原生的DateTime.AddHours方法转换为对应SQL语句,因此会抛出你遇到的异常。可以通过以下两种方式解决:
方法一:转换比较逻辑(推荐)
把对数据库字段的时间操作转移到客户端常量上,EF能正确生成对应的SQL。原逻辑「开始时间减去截止小时数 > 当前UTC时间」,等价于「开始时间 > 当前UTC时间加上截止小时数」,修改后的Where条件如下:
.Where(x => x.Capacity != null && x.Capacity != 0 && x.Start_Datetime > currentDateTime.AddHours((double)x.Event_Registration_Deadline) && // 核心修改 x.Fully_Booked_Flag != Constants.YesFlag && x.CoC_Schedule_Entry_Type.Schedule_Entry_Type_Code.Equals(lookuptype) && x.CoC_Lookup3.Hidden_Value.Equals(LookupCodes.OpenHiddenValue) && (x.Program_Preference_ID == programPreferenceId || x.Program_Preference_ID == null))
方法二:使用EF内置数据库函数
根据你使用的EF版本,调用EF提供的可转换为SQL的时间函数:
- EF6:使用
DbFunctions.AddHours - EF Core:使用
EF.Functions.AddHours
修改后的核心条件代码:
// EF6版本 DbFunctions.AddHours(x.Start_Datetime, (double)-x.Event_Registration_Deadline) > currentDateTime // EF Core版本 EF.Functions.AddHours(x.Start_Datetime, (double)-x.Event_Registration_Deadline) > currentDateTime
注意:使用这种方式需要确保引入对应命名空间(EF6需引入System.Data.Entity,EF Core需引入Microsoft.EntityFrameworkCore)。
内容的提问来源于stack exchange,提问作者Jucifer Ali
相关产品推荐
相关产品推荐

