2010-11-03 96 views
8

使用Linq to Entities,我試圖查詢日誌表以在匹配行附近查找行。我無法在查詢中添加日期。這是我迄今爲止所擁有的。在Linq中添加日期到實體

from 
    l in objectSet.Logs 
let 
    match = objectSet.Logs.Where(whatever).FirstOrDefault() 
where 
     l.Timestamp > (match.Timestamp - twoHours) 
    && l.Timestamp < (match.Timestamp + twoHours) 
select 
    l 

離開了「無所謂」條件是找到我感興趣的行,「twoHours」已經被可變的時間跨度,一個.AddHours()功能等。我還沒找到EF可以生成將字段值(match.Timestamp)的值添加到常量的SQL的正確方法。

顯而易見的解決方案是首先執行「匹配」查詢,然後在第二個查詢中使用字面值,但我已將代碼示例簡化爲主要問題(在查詢中添加日期)我的查詢更復雜,這不會是理想的。

乾杯

+0

我有過類似的問題,不推薦使用。問題是.AddHours()沒有SQL等價物,因此Linq無法將其轉換爲SQL表達式。我通過調用.ToList()來調用延遲執行來克服這個問題,然後在內存集合上應用.AddHours()過濾器。 – dotariel 2010-11-03 14:56:52

+0

@ XSaint32,這是雙重錯誤。 *有* [一個(T)SQL等價物,](http://msdn.microsoft.com/en-us/library/ms186819.aspx),您可以*從EF調用它。 – 2010-11-03 16:50:29

+0

@克雷格 - 感謝您的意見。我沒有意識到這一點。 – dotariel 2010-11-03 17:48:23

回答

11

您可以使用EntityFunctionsclass產生AddHours

from 
    l in objectSet.Logs 
let 
    match = objectSet.Logs.Where(whatever).FirstOrDefault() 
where 
     (l.Timestamp > EntityFunctions.AddHours(match.Timestamp, -1 * twoHours)) 
    && // ... 
select 
    l 

然而,不要指望這個WHERE與被索引優化,除非你對列的表達式指數。

+0

太棒了,謝謝Craig – 2010-11-05 03:21:04

+0

請注意,'EntityFunctions'已被標記爲廢棄。改爲在名爲System.Data.Entity的名稱空間中使用替換類'DbFunctions'。 – Amasa 2017-09-05 03:55:44

3

EntityFunctions是贊成DbFunctions

public int GetNumUsersByDay(DateTime Date) 
     { 
      using (var context = db) 
      { 
       var DateDay = new DateTime(Date.Year, Date.Month, Date.Day); 
       var DateDayTomorrow = DateDay.AddDays(1); 
       return context.Users.Where(m => DbFunctions.AddHours(m.DateCreated,-5) >= DateDay && m.DateCreated < DateDayTomorrow).Count(); 
      } 
     } 
+0

...如果你在EF 6或更高版本...... – 2014-12-01 10:02:08