LINQ to Entities 中使用的 AddDays 在除一台服务器之外的所有服务器中引发错误

Posted

技术标签:

【中文标题】LINQ to Entities 中使用的 AddDays 在除一台服务器之外的所有服务器中引发错误【英文标题】:AddDays used in LINQ to Entities throwing error in all but one server 【发布时间】:2014-12-10 02:23:05 【问题描述】:

在开发环境中,以下 SQL 语句正在运行,但在任何其他环境中都不起作用:

System.NotSupportedException:LINQ to Entities 无法识别方法“System.DateTime AddDays(Double)”方法,并且该方法无法转换为存储表达式。

相关代码:

bool hasSomethinglast14days = (from a in db.someTable
                               where a.SomeIntColumn == someIntVariable
                                  && a.CreateDate >= DateTime.UtcNow.AddDays(-14)
                               select a.someColumn).Any();

【问题讨论】:

我真的很想知道这在开发环境中是如何工作的。那里的数据库有什么完全不同的地方吗?还是某种不同的实体提供者?我不希望这适用于任何必须针对数据库实现的表达式树。 【参考方案1】:

您使用的提供程序无法将 AddDays() 方法转换为有效的 SQL 语句。

由于您要从中减去的日期无论如何都不依赖于数据库中的任何值,因此只需先进行减法(在查询之外),然后使用结果值:

var pastDate = DateTime.UtcNow.AddDays(-14);

bool hasSomethinglast14days = (from a in db.someTable
                               where a.SomeIntColumn == someIntVariable
                                  && a.CreateDate >= pastDate
                               select a.someColumn).Any();

至于它在您的开发环境中工作,我没有答案。我很惊讶它确实如此。

【讨论】:

即使我知道答案,它似乎一开始就没有在开发环境中工作过。谢谢!

以上是关于LINQ to Entities 中使用的 AddDays 在除一台服务器之外的所有服务器中引发错误的主要内容,如果未能解决你的问题,请参考以下文章

在实体框架和 Linq to Entities 中使用规范模式和表达式

为啥 LINQ-to-Entities 将此查询放在子选择中?

在 LINQ to Entities 中使用交叉应用取消透视数据

使用Linq to Entities在一个请求中选择计数和计数

在Linq To Entities中使用多个列联接表

有没有办法将简单的 LINQ 查询封装在可与 LINQ to Entities 查询一起使用的扩展方法中?