这个linq-to-sql查询是否检索所有记录,然后选择一个,或只检索一个?

时间:2014-05-08 12:12:35

标签: linq linq-to-sql

我正在寻找具有大量记录的表中的最高密钥,并且我想知道LINQ to SQL是否有效地执行此操作,或者我是否需要采用其他方法来确保代码并没有从数据库中提取所有记录。

        int tkey =
            (from r in GMSCore.db.Receipts
             orderby r.TransactionKey descending
             select r.TransactionKey).FirstOrDefault();

这解释如下:

select Top(1) TransactionKey 
from Receipt
order by TransactionKey desc

或者它是否拉出所有记录然后过滤C#代码?

1 个答案:

答案 0 :(得分:3)

它只检索一条记录。生成的查询将如下所示:

SELECT TOP(1) [t0].[TransactionKey] 
FROM Receipt [t0]
ORDER BY [t0].[TransactionKey] DESC

在您致电FirstOrDefault()或强制执行的其他运营商(请参阅Classification of Standard Query Operators by Manner of Execution)之前,不会执行查询。

你甚至可以将查询定义保存到变量中(感受差异 - 不是查询执行的结果,而是查询本身)

var query = from r in GMSCore.db.Receipts
            orderby r.TransactionKey descending
            select r.TransactionKey;

// Nothing is executed yet
int tkey = query.FirstOrDefault(); // SQL query is generated and executed

您可以稍后执行原始查询

foreach(var key in query) // another SQL is generated and executed
    // ...

但在这种情况下,生成的SQL查询看起来像

SELECT [t0].[TransactionKey] 
FROM Receipt [t0]
ORDER BY [t0].[TransactionKey] DESC

因此,您可以修改查询定义,直到执行完毕。例如。您可以添加过滤或更改排序。事实上,执行查询的运算符通常也会影响查询生成 - 例如选择第一个,单个或最大项目。