是否可以在第一次 where 条件为真后停止查询?(LINQ to SQL)

本文关键字:查询 LINQ SQL to 第一次 where 条件 是否 | 更新日期: 2023-09-27 18:32:16

是否可以在

第一次where条件为真后停止查询?

我只想得到第一条记录,它的时间比timeParameter大。 我现在拥有的是:

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

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

是否可以在第一次 where 条件为真后停止查询?(LINQ to SQL)

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

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

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

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

附言。如果你想真正弄清楚它是如何工作的,那么你可以看看表达式树和延迟执行

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

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

当你说:

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

您的意思是整个表按时间列升序排序吗?如果是这样的话,那么这些元素的自然顺序可能是正确的。尽管如此,我会在那里抛出一个order by声明,以确保你得到你想要的订单。最坏的情况是查询引擎会将其丢弃为不必要的。

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