簡體   English   中英

使用LINQ基於TimeSpan檢索記錄

[英]Retrieve Record Based on TimeSpan with LINQ

我不知道這是否行得通或可行,但讓我嘗試給出清楚的解釋。

可以說我有一個名為SummaryTests的數據庫表,其中包含以下記錄:

ID    |          Day           |    Summary    |
------------------------------------------------
 1       05/27/2016 09:01:00         Test1
 2       05/27/2016 09:04:00         Test2
 3       05/27/2016 09:08:00         Test3

現在,如果我想在05/27/2016 09:06:00將此表中添加一條記錄,則該表將如下所示:

ID    |          Day           |    Summary    |
------------------------------------------------
 1       05/27/2016 09:01:00         Test1
 2       05/27/2016 09:04:00         Test2
 3       05/27/2016 09:08:00         Test3
 4       05/27/2016 09:06:00         Test4  // added record

從我的角度來看,基於Day ,該記錄應該在記錄2和記錄3之間,但是在SQL中,順序基於ID 因此,如果我想基於Day檢索記錄,該記錄位於我剛剛添加的記錄(應該是記錄2)之前,這就是我一直在做的事情:

[HttpPost]
public ActionResult Create([Bind(Include = "ID,Day,Summary")] SummaryTest summaryTest)
{
    int previousRecord = db.SummaryTests.Where(x.Day < summaryTest.Day).OrderByDescending(x => x.Day).FirstOrDefault().ID;
    SummaryTest prevSumTest = db.SummaryTests.Find(previousRecord);
}

但是我的問題是,是否有一種方法可以只在用戶創建的記錄之前以最近的時間范圍檢索記錄? 我覺得這比先對數據庫排序然后按降序對其進行排序,然后再獲取該序列的第一個元素會更好。

任何幫助表示贊賞。

基本上,這是唯一的通用數據庫SQL方法。 如果您的表在“ Day列上有索引,則絕對沒有問題可以有效滿足您的查詢。

唯一可以改進的是消除第二個數據庫查詢。 無需檢索ID ,然后再使用該ID記錄,您只需使用

var prevSumTest = db.SummaryTests
    .Where(x.Day < summaryTest.Day)
    .OrderByDescending(x => x.Day)
    .FirstOrDefault();

不必擔心數據庫中記錄的順序,這就是服務器的工作。 如果要按特定順序返回數據,那么這正是ORDER BY子句的目的。 SQL將組織記錄以其認為合適的方式優化性能。 您需要在查詢中告訴它所需的數據以及所需的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM