Asp.net LINQ对SQL性能的影响;选择顶部{x}";询问

Asp.net LINQ对SQL性能的影响;选择顶部{x}";询问,asp.net,sql,linq-to-sql,select,Asp.net,Sql,Linq To Sql,Select,在查找如何使用LINQ to SQL执行与SELECT TOP 5等效的操作时,我看到的所有答案都建议使用.Take(),如下所示: var myObject = ( from myObjects in repository.GetAllMyObjects() select myObject) .Take(10); 我还不了解LINQ在幕后是如何工作的,但就我对C类语言的理解而言,这可以通过首先分配一个包含所有记录的临时数组来解决,然后将数组中的前10个元素复制到var。如果您处理的是一个小数

在查找如何使用LINQ to SQL执行与SELECT TOP 5等效的操作时,我看到的所有答案都建议使用.Take(),如下所示:

var myObject = (
from myObjects in repository.GetAllMyObjects()
select myObject)
.Take(10);
我还不了解LINQ在幕后是如何工作的,但就我对C类语言的理解而言,这可以通过首先分配一个包含所有记录的临时数组来解决,然后将数组中的前10个元素复制到var。如果您处理的是一个小数据集或没有任何性能约束,这不是一个问题,但是如果您从一个可能包含数百万条记录的表中选择最近的5个日志项,则对我来说效率非常低

我对它的理解是错误的吗?如果是的话,有人能解释一下到底发生了什么吗?否则,有什么(如果有的话)更好(即更有效)的方法通过LINQ到SQL只选择x条记录

[编辑]


我让假设的myObject类按照接受答案中的建议将LINQ to SQL输出发送到调试输出。最后我在这里使用了DebuggerWriter:

您的假设不正确。使用Linq to SQL,它计算为一个
表达式,可以对该表达式进行计算并生成正确的SQL。您不必担心它会加载所有记录

另外,请参见下面的问题。您可以将流附加到
DataContext
并查看生成的SQL。
LINQ使用延迟执行,对于LINQ到SQL,使用表达式树


在您枚举
Take
调用的结果之前,不会执行任何查询,因此您不必担心任何事情。

我上周刚刚讨论了这个问题!我在我的dev数据库上打开了SQL分析器,并逐步完成了代码。看到为各种查询生成的SQL非常有趣。我建议你也这样做。这可能不是对您的问题的确切回答,但看到您的各种组件如何根据调用的内容生成完全不同的SQL语句肯定会有所启发


我相信在MSDN上阅读“延迟查询解析”或其他(?)内容也会很有启发性。

在调试器中,您可以检查Linq对象,它将向您显示它将执行的SQL查询。也许这会有所帮助?据我所知,我使用的是一个SQL Express数据库,所以在这个实例中没有SQL分析器:(数据上下文输出日志记录是一个很棒的技巧!