我正在研究LINQ,尤其是MSDN上的LINQ to SQL,并且遇到了这个例子,除非有一些聪明的魔术,否则看起来像是一个极其牺牲计算资源而不是代码可读性的情况。
int highScoreCount =
(from score in scores
where score > 80
select score)
.Count();
有人请告诉我,此查询不会加载列表中的所有分数只是为了得到他们的计数。甚至不超过80分。
如果是这个特定查询的情况,是否有人要更改它以避免加载完整的分数列表?比如“选择(计数)得分”。
感谢。
编辑:我为懒惰而道歉,并没有想办法先查看生成的SQL。我发现最简单的方法是使用LinqPad答案 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。以下帖子解释: