2010-10-08 45 views
4

我有一個帶有DateTime「TimeStamp」列和int「TimeoutSeconds」列的表。我想從此表中檢索所有記錄,其中DateTime.Now - TimeStamp> TimeoutSeconds。在一個存儲過程,這是沒有道理的使用GETDATE():使用任一LINQ語法或λLINQ to Entities 4:在where子句中計算的查詢

select * from Schema.TableName mp 
where (GetDate() - mp.[Timestamp]) > mp.Timeout 

然而,實體框架我不能做到這一點,因爲它似乎拉姆達輸入變量(MP)不能被用作部分計算僅作爲謂詞的一部分,所以這不會編譯:

var records = context.TableName.Where(mp => (DateTime.Now - mp.TimeStamp) > mp.Timeout); 

這不會編譯。

我不想檢索整個表格,然後在內存中進行篩選,而不是使用存儲的proc或實體SQL。我在這裏有什麼選擇?

+0

你會得到什麼錯誤? TimeStamp和Timeout的類型是什麼? – 2010-10-08 08:10:03

回答

4

這不會編譯,因爲您正在比較(DateTime.Now - mp.TimeStamp),它有返回類型System.TimeSpanint。浮現在腦海的第一個解決方案是做

Where(mp => (DateTime.Now - mp.TimeStamp) > new TimeSpan(0, 0, 0, mp.Timeout)) 

可惜,這似乎並沒有在EF工作,所以如果你有MS SQL Server作爲數據庫,你可以在EF4使用SqlFunctions

var records = context. 
       TableName. 
       Where(mp => System.Data.Objects.SqlClient.SqlFunctions. 
          DateDiff("s", mp.TimeStamp, DateTime.Now) > mp.Timeout); 

http://msdn.microsoft.com/en-us/library/dd487052.aspx