2016-05-27 14 views
0

これが機能するかどうかわかりませんが、わかりやすく説明してください。私は05/27/2016 09:06:00で、このテーブルにレコードを追加したい場合は、表は次のようになり、今LINQを使用したTimeSpanに基づくレコードの取得

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 

は、私は、データベースのテーブルには、次のレコードが含ま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 
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); 
} 

をしかし、私の質問があり、そこにあります最も近いの時間軸のレコードを取得する方法は、の前に、のレコードをユーザーが作成していますか?データベースをソートして降順で並べ替えるだけでなく、そのシーケンスの最初の要素を取得するよりも、それがうまくいくかのように感じます。

何か助けていただければ幸いです。

答えて

2

基本的にSQLの唯一の一般的な方法です。テーブルにDay列のインデックスがある場合は、クエリを効率的に実行するための問題はありません。

改善できる点は、2番目のデータベースクエリを削除することだけです。 IDを取得し、そのIDを使用してレコードを取得する代わりに、単に

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

データベース内のレコードの順序は心配しないでください。それはサーバーのジョブです。データを特定の順序で返すことを望むなら、それは正確にはORDER BYの句です。 SQLはパフォーマンスを最適化するためにどのように見えるかを記録します。あなたはあなたが望むデータとそれをあなたの質問にどのようにして伝える必要があります。

関連する問題