.NET LINQ to SQL 查询效率

.NET LINQ to SQL query efficiency

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

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

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

如果此特定查询属于这种情况,是否需要更改它以避免加载完整的分数列表?像 "select (count) score".

谢谢。

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

Someone please tell me that this query does not load all the scores in the list just to get their count. Or even not the scores over 80.

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

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

和return这对你来说很重要。

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

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

How to view LINQ Generated SQL statements?

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

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