4

是否可以在第一次where条件为真后停止查询?

我只想获得时间大于的第一条记录timeParameter。我现在拥有的是:

var records = from rec in table
              where rec.time > timeParameter
              select rec;
return records.FirstOrDefault();

数据库中的时间列是按升序排列的,所以第一次where条件为真时,不需要继续查询。我在数据库中有很多行,所以我希望查询尽快停止。

4

2 回答 2

2

您当前的代码将执行您的要求。

.FirstOrDefault()方法短路。在这种情况下,它会生成一个以 开头的 SQL 查询,SELECT TOP 1 ...SQL Server 引擎知道这意味着它可以在找到第一项后停止评估。

当你说:

数据库中的时间列按升序排列...

你的意思是整个表是按时间列升序排列的吗?如果是这样,那么这些元素的自然顺序可能是正确的。不过,我会order by在那里发表声明,以确保您获得所需的订单。最坏的情况是查询引擎会因为不必要而丢弃它。

var records = from rec in table
              where rec.time > timeParameter
              order by rec.time
              select rec;
return records.FirstOrDefault();
于 2012-04-26T14:29:31.893 回答
2

实际上,这应该停止。records是一个IQueryable,因此在您请求数据(通过 FirstOrDefault)之前不会运行,这将添加适当的停止。

基本上,当您将records变量分配给 LINQ 语句时,它只是作为 SQL 将被加载到内存。但是,在您实际调用访问数据之前,它不会评估任何内容。此时,SQL 将根据您使用的任何扩展方法(FirstOrDefault在本例中)进行适当修改并实际执行。

但是,正如 Andrew Barber 指出的那样,您的查询需要实际声明order by否则它将在没有它的情况下运行。(除非该表在 DB 端真正排序为 DangerMonkey 对位点)

          from rec in table
          where rec.time > timeParameter
          order by rec.time
          select rec;

PS。如果您想真正弄清楚这是如何工作的,那么您可以查看表达式树延迟执行

于 2012-04-26T14:30:03.033 回答