我正在寻找具有大量记录的表中的最高密钥,并且我想知道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#代码?
答案 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
因此,您可以修改查询定义,直到执行完毕。例如。您可以添加过滤或更改排序。事实上,执行查询的运算符通常也会影响查询生成 - 例如选择第一个,单个或最大项目。