我不知道这是否有效,但让我试着给出一个明确的解释。
假设我有一个名为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 的记录之前用户正在创建的记录?我觉得好像要对数据库进行排序然后按降序排序,然后获取该序列的第一个元素。
感谢任何帮助。
答案 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将组织记录如何适合优化性能的记录。您需要告诉它您想要的数据,以及您在查询中的需求。