【问题标题】:.NET LINQ to SQL query efficiency.NET LINQ to SQL 查询效率
【发布时间】:2015-08-04 23:20:30
【问题描述】:

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

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

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

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

谢谢。

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

【问题讨论】:

  • 好的,它不会加载列表中的所有分数只是为了计算它们!
  • 说真的,您是否尝试过查看它生成的 SQL?
  • 好的,我为这个懒惰的问题道歉,我应该寻找查看生成 SQL 的方法。无论如何,我发现查看生成的 SQL 的最简单方法是在 LinqPad 中运行一些查询。这里生成的SQL和我手写的相差不远。

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


【解决方案1】:

() 中语句的第一部分实际上评估了一个尚未执行的 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】:

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

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

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

    并将该值返回给您。

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

    【讨论】:

      【解决方案3】:

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

      How to view LINQ Generated SQL statements?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多