Linq到EntityFramework DateTime

在我的应用程序中,我正在使用entity framework。

我的表

-Article -period -startDate 

我需要匹配logging=> 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) 

当我运行我的代码时发生以下exception

LINQ to Entities不识别“System.DateTime AddDays(Double)”方法,并且此方法不能转换为存储expression式。

当使用LINQ to Entity Framework时,Where子句中的谓词被转换为SQL。 你得到这个错误,因为没有翻译到SQL的DateTime.Add()这是有道理的。

快速的解决方法是将第一个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,您也可以尝试EntityFunctions.AddDays方法:

 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

我认为这是最后一个答案试图build议的内容,而不是试图添加p.startdat(不能转换为sql语句)的日子,为什么不做一些可以等同于sql的东西:

 var baselineDate = DateTime.Now.AddHours(-24); something.Where(p => p.startdate >= baselineDate) 

如何从DateTime.Now减去2天?

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

说实话,我不确定你想要达到什么目的,但这可能会奏效

如果您需要将expression式转换为SQL,则可以尝试使用

System.Data.Entity.Core.Objects.AddDays方法。

实际上已经过时了,但是起作用了。 它应该被replaceSystem.Data.Entity.DbFunctions.AddDays,但我找不到它…