2010-10-26 63 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