Linq 到 EntityFramework 日期时间

在我的应用程序中,我正在使用实体框架。

我的桌子

-Article
-period
-startDate

我需要匹配 = > DateTime.Now > startDate and (startDate + period) > DateTime.Now的记录

我试过这个代码,但它现在工作

Context.Article
.Where(p => p.StartDate < DateTime.Now)
.Where(p => p.StartDate.AddDays(p.Period) > DateTime.Now)

当我运行我的代码时,会发生以下异常

LINQ 到实体不识别方法的系统。方法,此方法不能转换为存储表达式。

81947 次浏览

使用 LINQtoEntity Framework 时,Where 子句中的谓词将被转换为 SQL。之所以出现这个错误,是因为没有对 DateTime.Add()的 SQL 转换,这是有意义的。

一个快速的解决方案是将第一个 Where 语句的结果读入内存,然后使用 LINQ to Objects 来完成过滤:

Context.Article.Where(p => p.StartDate < DateTime.Now)
.ToList()
.Where(p => p.StartDate.AddDays(p.Period) > DateTime.Now);

如果你使用.NET 4.0,你也可以尝试 实体函数方法:

Context.Article.Where(p => p.StartDate < DateTime.Now)
.Where(p => EntityFunctions.AddDays(p.StartDate, p.Period)
> DateTime.Now);

注意: 在 EF 6中现在是 System.Data.Entity.DbFunctions.AddDays

从日期时间中减去2天怎么样? 现在:

Context.Article
.Where(p => p.StartDate < DateTime.Now)
.Where(p => p.StartDate > DateTime.Now.Subtract(new TimeSpan(2, 0, 0, 0)))

老实说,我不知道你想达到什么目的,但这可能会奏效

I think this is what that last answer was trying to suggest, but rather than trying to add days to p.startdat (something that cannot be converted to a sql statement) why not do something that can be equated to sql:

var baselineDate = DateTime.Now.AddHours(-24);


something.Where(p => p.startdate >= baselineDate)

如果需要将表达式转换为 SQL,可以尝试使用

系统。数据。实体。核心。对象。添加日期 method.

实际上是标记过时,但它的工作。 它应该被 System. Data. Entity.Dbfunction. AddDays 替换,但我找不到它..。