代码之家  ›  专栏  ›  技术社区  ›  Paceman

.NET LINQ to SQL查询效率

  •  -1
  • Paceman  · 技术社区  · 9 年前

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

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

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

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

    谢谢

    编辑:我很抱歉,我很懒,没有先找到查看生成的SQL的方法。我发现最简单的方法就是使用LinqPad

    3 回复  |  直到 9 年前
        1
  •  5
  •   KnightFox    9 年前

    ()中语句的第一部分实际上计算尚未执行的IQueryable。当您对其调用Count()函数时,它将按如下方式编译和计算查询

    SELECT 
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT 
        COUNT(1) AS [A1]
        FROM [dbo].[scores] AS [Extent1]
        WHERE [Extent1].[score] > 80
    )  AS [GroupBy1]
    
        2
  •  3
  •   Community CDub    8 年前

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

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

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

    并将该值返回给您。

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

        3
  •  2
  •   Community CDub    8 年前

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

    How to view LINQ Generated SQL statements?