2017-04-05 23 views
0

我得到奇怪的結果,試圖使用Linq和EF Core對日期列進行簡單查詢。奇怪的結果在使用EF核心的linq查詢中使用日期

如果我使用DateTime列表中的日期運行查詢,則不會得到任何結果。如果我替換DateTime.Now並添加負數天,以便如果匹配日期時間列表中的日期,則查詢返回預期結果。

那麼DateTime.Now和另一個DateTime對象有什麼區別?

在實踐中,爲什麼會變成這樣的工作(在第一個例子了30天了復卷給出相同的日期作爲datesToCheck [0]第二):

var reports = from r 
       in db.DailyReports 
        .Where(r => r.UserId.Equals(currentuser.Identity.Name) 
          && r.Date > DateTime.Now.AddDays(-30)) 
       select r; 

但不是這樣的:

var reports = from r 
       in db.DailyReports 
        .Where(r => r.UserId.Equals(currentuser.Identity.Name) 
          && r.Date > datesToCheck[0]) 
       select r; 

的數據庫是SQL服務器2017年,列

的datesToCheck列表生成周四非空的SMALLDATETIME S:

var datesToCheck = new List<DateTime>(); 

var startDate = DateTime.Now; 
//get Monday date three weeks ago 
if (DateTime.Now.DayOfWeek != DayOfWeek.Monday) 
{ 
    while (startDate.DayOfWeek != DayOfWeek.Monday) 
     { 
      startDate = startDate.AddDays(-1); 
     } 
} 

startDate = startDate.AddDays(-21); 
while (startDate < DateTime.Now) 
{ 
    if (startDate.DayOfWeek != DayOfWeek.Saturday || startDate.DayOfWeek != DayOfWeek.Sunday) 
    { 
     datesToCheck.Add(startDate); 
     startDate = startDate.AddDays(1); 
    }  
} 
+0

沒有意義,您能向我們展示'datesToCheck [0]'聲明和值嗎? –

+0

沒問題胡安卡洛斯 - 我已經將它添加到問題 – Tim

+0

沒有意義,兩個謂詞將在內存中進行評估(首先因爲AddDays函數,其次是因爲數組/列表索引器)。只要'datesToCheck [0]'包含'DateTime.Now.AddDays(-30)',兩個查詢都應該返回一個相同的結果。 –

回答

1

同樣的行爲,而且據我所知,EF的所有版本。基本上,編譯器不夠聰明,以決定是否應該計算或轉換爲SQL的datesToCheck [0]。如果將該值存儲在變量中,然後在LINQ查詢中使用該變量,該查詢將起作用。另請參閱:Why can't we use arrays in Entity Framework queries?

0

你可能有一些數據類型的問題,嘗試:存在於EF6

DateTime datesToCheck = DateTime.Now.AddDays(-30); 
var reports = from r 
       in db.DailyReports 
        .Where(r => r.UserId.Equals(currentuser.Identity.Name) 
          && r.Date > datesToCheck) 
       select r; 
+0

感謝胡安卡洛斯 - 這與在查詢中放置DateTime.Now.AddDays(-30)相同。只有當我嘗試使用DateTime列表中的值時,它纔會失敗。即使我創建一個新的DateTime變量並將列表中的值賦給它,它仍然不會返回任何結果。 – Tim

+0

正如我所說的,問題是你用'datesToCheck [0]'變量調試了這個值嗎?我仍然檢查你的代碼,但沒有看到任何東西。 –