. net LINQ到SQL的查询效率

本文关键字:查询 效率 SQL LINQ net | 更新日期: 2023-09-27 18:06:18

我正在研究LINQ,特别是MSDN上的LINQ to SQL,并且遇到了这个例子,除非有一些聪明的魔法在背后,否则它看起来像是一个极端牺牲计算资源而不是代码可读性的案例。

int highScoreCount =
    (from score in scores
     where score > 80
     select score)
     .Count();

有人请告诉我,这个查询不加载列表中的所有分数只是为了得到他们的计数。甚至超过80分也不行。

如果这是这个特定查询的情况,是否有一个改变它,以避免加载完整的分数列表?比如"select (count) score"

谢谢。

编辑:我为懒惰而道歉,没有首先查找查看生成SQL的方法。我发现最简单的方法就是使用LinqPad

. net LINQ到SQL的查询效率

()内部语句的第一部分实际上计算尚未执行的IQueryable。当您对它调用Count()函数时,它将编译并计算查询,如下所示

SELECT 
[GroupBy1].[A1] AS [C1]
FROM ( SELECT 
    COUNT(1) AS [A1]
    FROM [dbo].[scores] AS [Extent1]
    WHERE [Extent1].[score] > 80
)  AS [GroupBy1]

有人请告诉我,这个查询不加载列表中的所有分数只是为了得到他们的计数。甚至超过80分也不行

我告诉你,它不会将任何项加载到内存中,它会生成相当于你手动编写的SQL查询:

SELECT COUNT(*) As Count FROM MyTable WHERE Score > 80;

,并将该值返回给您。

您可以通过查看发送到数据库的SQL来验证自己。通过启用对数据库本身的分析,或者通过使用跟踪:如何查看LINQ生成的SQL语句?

LINQ在如何获取数据方面相当聪明…也许不如查询优化器那么聪明,但它可以做一些正确的事情。您可以很容易地查看由它生成的SQL。下面的文章解释:

如何查看LINQ生成SQL语句?