2012-12-03 22 views
4

這工作LINQ查詢在轉換爲SQL之前在C#中進行評估?

DateTime dtYesterday = DateTime.Now.AddDays(-1); 
data = data.Where(d => d.CreatedTime <= dtYesterday); 

但這並不

data = data.Where(d => d.CreatedTime <= DateTime.Now.AddDays(-1)); 

因爲EF不能把它翻譯成SQL。沒關係。

但是出於好奇,有沒有辦法在將它翻譯成SQL之前強制它評估DateTime.Now.AddDays(-1)的值?

我想知道是否有類似這樣的語法?

data = data.Where(d => d.CreatedTime <= ForceEvaluate(DateTime.Now.AddDays(-1))); 
+0

這一切都取決於'IQueryable'暴露的'IQueryProvider'。 –

回答

1

IQueryable<T>IEnumerable<T>之間的區別在於,前者保持程序員(即你)寫至其呈現給執行查詢中的查詢引擎(即,RDBMS)的表達。搞清楚這DateTime.Now.AddDays(-1)是需要評估會工作的功能,但相比與熟悉的和易於辨認的語法簡單而直接的解決辦法就是太法寶:

DateTime dtYesterday = DateTime.Now.AddDays(-1); 
data = data.Where(d => d.CreatedTime <= dtYesterday); 

有猜測的會搶程序員有機會將諸如DateTime.Now.AddDays(-1)之類的函數傳遞給RDBMS:完全可以想象,當前數據庫日期/時間與應用程序服務器不同,可能會導致不同的行集合。另一方面,引入ForceEvaluate語法將毫無意義,因爲如果必須標記要評估的表達式,則可以使用熟悉的方式(請參閱上面粘貼的代碼)進行。