2010-10-26 78 views
1

我需要得到两个日期的差异,一个日期从一个表和一个当前日期,差异应该小于9 0天。我需要在将LINQ 的子句我试图这样做EF4中的日期差异

变种列表中context.persons 以此作为过滤器从= p,其中((p.CreateDT).Subtract(DateTime.Now).Days < 90 ) select p;

我得到这个错误时抛出:

LINQ实体无法识别方法“System.TimeSpan减法(System.DateTime的)”方法,和这种方法不能被翻译成表达商店。

我没有研究其他文章,但没有helped..Any想法

回答

4

这里的诀窍是,它不能将你所有的花哨的ooo-ha变成普通的旧sql。关键是要翻转它的头:

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

说明

请记住,在你的LINQ语句的WHERE位都必须从C#翻译由EF为SQL。它非常非常出色,能够处理大多数基本任务,但它不知道如何理解最基本的方法调用,例如DateTime.Subtract()。因此,这里的想法是通过预先计算一个值然后将其传递给数据层来让它做到最好。

第一行从当前时间减去90天,增加负90天。第二行将它传递给数据库服务器。

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

+0

不应该是x.CreateDT>之前 - 他希望日期少于90天前。 – 2010-10-26 18:01:55

+0

工作...你能解释吗?为什么-90 .... – rakeshvenkata 2010-10-26 18:11:59

+0

@ user183296因为“0-90 == 0 + -90”。这里没什么特别的。要用DateTime.Add减去增量(),您可以简单地将它传递给负值。 – 2010-10-26 18:49:21

2

更新

看来,EF不支持减去日期和返回时间跨度。下面就来解决这个问题的一种方法:

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

见#2 this线程。

+0

看到这种情况..DbArithmeticExpression参数必须具有数字通用类型。 – rakeshvenkata 2010-10-26 17:46:04

+0

@ user183296 - 更新了我的答案,因为事实证明,您不能在EF – 2010-10-26 17:57:05

0

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

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

+1

中看到(p.CreateDate - DateTime.Now)的这种偏离.Days <90 ..DbArithmeticExpression参数必须具有数字通用类型。 – rakeshvenkata 2010-10-26 17:46:56