2011-02-22 57 views
4

比方說你有以下LINQ表達式:有沒有什麼辦法讓Linq到實體,以評估本地表達

from o in salesEntities.Orders where o.OrderDate < DateTime.Today.AddDays(-20) select o 

實體框架不知道怎麼翻譯DateTime.Today.AddDays( - 20)到實體SQL表達式,您會收到以下錯誤:

LINQ to Entities does not recognize the method 'System.DateTime AddDays(Double)' method, and this method cannot be translated into a store expression.

因此,這裏是我的問題:有沒有什麼辦法讓LINQ到實體評估lambda表達式的一部分,替換一個恆定值,沒有我必須聲明一個局部變量來保存它?

回答

3

簡短的答案是否定的。 linq到實體表達式的所有東西都必須在本地變量中,或者能夠被實體框架翻譯成sql表達式。

9

LINQ-to-Entities可以處理本地值而不是本地表達式。您的代碼將這個微小的變化工作:

var pastDate = DateTime.Today.AddDays(-20);

from o in salesEntities.Orders where o.OrderDate < pastDate select o

+4

這是正確的。在實際確實需要查詢中的AddDays(這不是其中的一種)的情況下,使用EntityFunctions類型。 – 2011-02-22 17:21:05

+0

指向EntityFunctions的指針......不知道這一點。便利! – 2011-02-22 17:35:45

+0

正如我在問題結束時問到的,這可以在沒有局部變量的情況下完成嗎?我剛剛寫了一個包含8個不同日期的查詢,所以現在我有8個額外的局部變量混淆了我的代碼。有一種方法可以說只是執行這一點,並將結果傳遞給查詢。 – Darren 2011-02-23 09:44:48

5

使用EntityFunction更改您的表達式添加天是這樣的:

var result = 
(
from o in salesEntities.Orders 
where o.OrderDate < System.Data.Objects.EntityFunctions.AddDays(DateTime.Today,-20) 
select o 
); 
相關問題