EF4的日期差异

时间:2010-10-26 17:32:46

标签: c# linq entity-framework-4

我需要得到两个日期的差异,一个日期来自一个表格,另一个日期当前日期,差异应该小于9 0days。我需要在linq的where子句中使用它作为过滤器 我试过这个

var list = from context.persons中的p            where((p.CreateDT).Subtract(DateTime.Now).Days< 90)           选择p;

我得到了这个问题:

LINQ to Entities无法识别方法'System.TimeSpan Subtract(System.DateTime)'方法,并且此方法无法转换为商店表达式。

我研究了其他文章,但没有任何帮助。任何想法

4 个答案:

答案 0 :(得分:4)

这里的诀窍在于它无法将你所有的幻想oo hoo-ha翻译成普通的旧sql。诀窍是将它翻转到它的头上:

var before = DateTime.Now.AddDays(-90);
var persons = context.Persons.Where(x => x.CreateDT > before);

说明

请记住,LINQ语句的WHERE位中的所有内容都必须由EF从C#转换为SQL。它非常非常强大,可以开箱即用并处理大多数基本任务,但它不知道如何理解最基本的方法调用,例如DateTime.Subtract()。所以这里的想法是让它通过预先计算一个值然后将其传递给数据层来做它最擅长的事情。

第一行通过添加负90天从当前时间减去90天。第二行将其传递给数据库服务器。

第二行应转换为SQL WHERE CreateDT> @BEFORETHIS

答案 1 :(得分:2)

<强>更新

似乎EF不支持减去日期并返回TimeSpan。这是解决问题的一种方法:

DateTime oldestDate = DateTime.Now.AddDays(-90); 
var list = from p in context.persons 
           where p.CreateDT >= oldestDate
           select p;

请参阅Stackoverflow上的this个帖子。

答案 2 :(得分:1)

我认为您必须使用EntityFunctions.DiffDays在您的查询中进行计算。 看到: How do I get Age distribution list by grouping

答案 3 :(得分:0)

尝试简单地(p.CreateDate - DateTime.Now).Days < 90。而不是调用DateTime.Subtract()。在某些情况下,即使相应的命名方法不是,也会为Entity Framework实现运算符重载。

如果这不起作用,您可以使用ESQL或存储过程。作为最终的脏解决方案,您可以调用context.persons.ToList()然后调用DateTime.Subtract()。