LINQ to Entities减去2个date
我正在尝试使用entity framework来确定使用LINQ的两个date之间的天数。 它告诉我,它不能识别System.TimeSpan类中的减法
这是我的LINQ查询的哪一部分。
where ((DateTime.Now.Subtract(vid.CreatedDate).TotalDays < maxAgeInDays))
这里是我在VS.NETdebugging器中收到的错误
{“LINQ to Entities不能识别'System.TimeSpan Subtract(System.DateTime)'方法的方法,而且这个方法不能被转换成存储expression式。
我做错了什么或者是否有更好的方法来获得entity framework中的2个date时间之间的天数?
谢谢Michael
在这种情况下,接受的答案是更好的,但作为参考,您可以使用EntityFunctions
类来执行date等操作。
where (vid.CreatedDate >= EntityFunctions.AddDays(DateTime.Now, -maxAgeInDay))
这是我如何工作
我定义了一个代表最早date的date时间variables
DateTime oldestDate = DateTime.Now.Subtract(new TimeSpan(maxAgeInDays, 0, 0, 0, 0)); ...
然后我修改了LINQ查询的where部分
where (vid.CreatedDate >= oldestDate )
像一个魅力工作 – 感谢弥迦让我考虑expression树
你也可以使用System.Data.Objects.EntityFucntions
:
currentDate = DateTime.Now; ... where EntityFunctions.DiffDays(currentDate, vid.CreatedDate) < maxAgeIdDays
EntityFunctions
所有函数仅用于Linq到实体,并映射到SQL函数。
由于谓词需要转换为expression式树,所以会遇到这种types的exception。 而翻译过程不能识别DateTime.Now.Subtract方法。
事实上,通过devise,LINQ to Entities需要将整个查询转换为SQL语句。 这是无法识别减法的地方。 只要您尝试在查询中使用C#/ VB方法,就会发生这种情况。 在这些情况下,您必须找出一种方法来从查询中找出这个部分。 这篇文章解释了更多: http : //mosesofegypt.net/post/LINQ-to-Entities-what-is-not-supported.aspx
您可以在模型中定义新的属性:
public DateTime StartDate{ get; set; } public DateTime EndDate{ get; set; } public TimeSpan CalculateTime{ get { return EndDate.Subtract(StartDate); } }
现在,你可以使用类似的东西:
var query = from temp in db.Table select new MyModel { Id = temp.Id, Variable1 = temp.Variable1, ... EndDate = temp.EndDate, StartDate = temp.StartDate }
当你看结果时,你可以使用返回如:
return query
现在,在查询中,我们有CalculateTime(在EndDate和Startdate之间减去)。