使用LINQ检索基于TimeSpan的记录

时间:2016-05-27 17:46:10

标签: c# linq datetime asp.net-mvc-5

我不知道这是否有效,但让我试着给出一个明确的解释。

假设我有一个名为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);
}

但我的问题是,有没有办法只检索最接近 timepan 的记录之前用户正在创建的记录?我觉得好像要对数据库进行排序然后按降序排序,然后获取该序列的第一个元素。

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

您的方式基本上是唯一的通用数据库SQL方式。如果您的表在Day列上有索引,那么有效地满足您的查询绝对没有问题。

唯一可以改进的是消除第二个数据库查询。您可以简单地使用

,而不是使用该ID检索ID然后检索记录
var prevSumTest = db.SummaryTests
    .Where(x.Day < summaryTest.Day)
    .OrderByDescending(x => x.Day)
    .FirstOrDefault();

答案 1 :(得分:1)

不要担心数据库中记录的顺序,这是服务器的工作。如果您希望以特定顺序返回数据,那正是ORDER BY子句的用途。 SQL将组织记录如何适合优化性能的记录。您需要告诉它您想要的数据,以及您在查询中的需求。