在查找如何使用 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/