.NET LINQ to SQL查询效率

时间:2015-08-04 23:20:30

标签: c# .net linq linq-to-sql

我正在研究LINQ,尤其是MSDN上的LINQ to SQL,并且遇到了这个例子,除非有一些聪明的魔术,否则看起来像是一个极其牺牲计算资源而不是代码可读性的情况。

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

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

如果是这个特定查询的情况,是否有人要更改它以避免加载完整的分数列表?比如“选择(计数)得分”。

感谢。

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

3 个答案:

答案 0 :(得分:5)

()中语句的第一部分实际上是评估尚未执行的IQueryable。当你调用Count()函数时,它会编译并评估查询,如下所示

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

答案 1 :(得分:3)

  

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

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

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

并将该值返回给您。

您可以通过查看发送到数据库的SQL来验证自己。通过启用数据库本身的分析,或使用跟踪:How to view LINQ Generated SQL statements?

答案 2 :(得分:2)

LINQ对于如何获取数据非常聪明......可能不如查询优化器那么聪明,但它可以做一些正确的事情。您可以非常轻松地查看由它生成的SQL。以下帖子解释:

How to view LINQ Generated SQL statements?