为何LINQ不支持内联日期计算?报错示例及解决方法
解决LINQ to Entities无法识别
DateTime.AddMonths方法的问题 嘿,这个问题我太熟了!你遇到的是LINQ to Entities的一个常见限制:它没办法把你在Lambda表达式里直接调用的某些.NET方法转换成数据库能识别的SQL语句,DateTime.Now.AddMonths(-1)就属于这类“无法转换”的方法。
先看你原来的代码,运行时会触发报错:
var jobsSinceLastRun = _rep.GetJobs(j => j.CompletedDate > DateTime.Now.AddMonths(-1));
LINQ to Entities 无法识别方法'System.DateTime AddMonths(Int32)',该方法无法转换为存储表达式。
为啥会出现这个问题?
当你在LINQ查询的过滤条件里直接调用AddMonths时,Entity Framework会尝试把整个Lambda表达式翻译成对应的SQL查询。但EF的表达式转换器不知道怎么把**.NET的AddMonths方法**映射成数据库里的日期运算函数(比如SQL Server里的DATEADD),所以就直接抛出错误了。
简单有效的修复方法
把日期计算移到查询外面,先算出一个具体的DateTime变量,再把这个变量用到查询里:
// 先在查询外部计算出一个月前的日期 DateTime oneMonthAgo = DateTime.Now.AddMonths(-1); // 再用这个变量构建查询 var jobsSinceLastRun = _rep.GetJobs(j => j.CompletedDate > oneMonthAgo);
这样一来,EF只需要把oneMonthAgo这个具体的日期值传递给SQL查询,不需要再去转换AddMonths方法,自然就能正常运行了。
内容的提问来源于stack exchange,提问作者Bob Tway
相关产品推荐
相关产品推荐

