Entity Framework日期比较报错:LINQ to Entities不支持Date类型成员
问题解决方案
错误原因
报错的核心是你在LINQ to Entities查询中调用了DateTime.Date这个.NET内存属性,EF无法将这个属性调用翻译成对应的SQL语句,哪怕外层包裹了DbFunctions.TruncateTime,内部的rec.Date.Date首先就会触发不支持的异常。
修复方案
你可以根据你使用的EF版本任选以下一种方案:
方案1:直接使用DbFunctions.TruncateTime处理原始字段
去掉对实体字段的.Date调用,直接传入原始DateTime字段即可,TruncateTime方法本身就会帮你完成时间截断的逻辑:
List<int> Ids = context.Record .Where(rec => DbFunctions.TruncateTime(rec.Date) == date) .Select(rec => rec.Id) .ToList();
方案2:使用日期间隔判断(EF Core 3.0+ 推荐)
使用EF.Functions.DateDiffDay判断两个日期的天数差为0即可判断为同一天,不需要做字段截断,查询性能更好:
List<int> Ids = context.Record .Where(rec => EF.Functions.DateDiffDay(rec.Date, date) == 0) .Select(rec => rec.Id) .ToList();
方案3:数据库字段为Date类型时直接比对
如果你已经将数据库对应字段改为Date类型,无需做任何截断操作,直接判断字段相等即可,EF会自动适配类型:
List<int> Ids = context.Record .Where(rec => rec.Date == date) .Select(rec => rec.Id) .ToList();
注意事项
- 不要在LINQ to Entities的查询表达式内对实体字段调用.NET内置的DateTime相关属性/方法(如
Date、AddDays等),这类调用无法被EF翻译成SQL语句,仅可使用EF官方提供的DbFunctions/EF.Functions下的适配方法。 - 如果需要对查询参数做处理,建议在查询外部提前处理完成,不要放到查询表达式中处理。
内容的提问来源于stack exchange,提问作者Khaled Ayman
相关产品推荐
相关产品推荐

