asp.net - "SELECT TOP {x}"查询的 LINQ to SQL 性能

标签 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 个元素来解决变种。如果您正在处理小型数据集或没有任何性能限制,那么这不是问题,但如果您从可能包含数百万条记录的表中选择最新的 5 个日志条目,那么对我来说效率似乎非常低。

我对其工作原理的理解是否有误?如果是这样,有人可以解释一下到底发生了什么吗?否则,有什么(如果有)更好(即更有效)的方法可以通过 LINQ-to-SQL 仅选择 x 条记录?

[编辑]

我有假设的 myObject 类,根据已接受答案中的建议将 LINQ-to-SQL 输出发送到调试输出。我最终使用了这里的 DebuggerWriter:http://www.u2u.info/Blogs/Kris/Lists/Posts/Post.aspx?ID=11

最佳答案

你的假设是不正确的。使用 Linq to SQL,其计算结果为 Expression<Func<...>>可以对其进行评估并生成正确的 SQL。您无需担心它会加载所有记录。

另外,请参阅以下问题。您可以将流附加到您的 DataContext并查看生成的 SQL。 How to get the TSQL Query from LINQ DataContext.SubmitChanges()

关于asp.net - "SELECT TOP {x}"查询的 LINQ to SQL 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2039616/

相关文章:

c# - MVC4中如何显示图片网格

c# - 以编程方式将 IIS 主机 header 添加到网站

php - MySQL 搜索多个表

mysql - SQL插入查询中的Sysdate函数

c# - 如何在 linq-to-sql 中返回匿名类型

c# - Azure IQueueClient : How do you simulate incoming messages?

asp.net - Orchard CMS - 导航不再工作

java - 具有单个连接的连接池与不频繁查询的连接

c# - 具有 LinQ 相关查询的 MySQL Entity Framework 未执行

asp.net - LINQ to SQL 执行时间比 SSMS SQL 长 50 倍