如何使用Linq返回前100条记录?使用Linq选择前100条记录
我有一张拥有4000万条记录的表格。
此代码的工作,但它是缓慢的,因为将过滤器之前返回的所有值:
var values = (from e in dataContext.table_sample
where e.x == 1
select e)
.Take(100);
是否有返回过滤的方法吗?像T-SQL TOP子句一样?
如何使用Linq返回前100条记录?使用Linq选择前100条记录
我有一张拥有4000万条记录的表格。
此代码的工作,但它是缓慢的,因为将过滤器之前返回的所有值:
var values = (from e in dataContext.table_sample
where e.x == 1
select e)
.Take(100);
是否有返回过滤的方法吗?像T-SQL TOP子句一样?
不,在过滤之前不会返回所有值。 Take(100)
将最终成为发送的SQL的一部分 - 很可能使用TOP。
当然,当你指定orderby
子句时,这样做更有意义。
LINQ在到达查询表达式的末尾时不会执行查询。只有在调用聚合运算符(例如Count
或Any
)或者开始遍历结果时,它才会发送任何SQL。即使调用Take
也不会实际执行查询 - 例如,您可能希望在后面进行更多的筛选,最终可能会成为查询的一部分。
当您开始迭代结果时(通常使用foreach
) - 即当SQL将实际发送到数据库时。
(我想你的where
条款是有点坏了,顺便说一下,如果你有你的真正的代码问题,这将有助于看到代码接近现实越好。)
我在进入前100名之前,不要认为你是正确的返回所有记录。我认为Linq决定执行查询时SQL字符串将会是什么(又名Lazy Loading),并且你的数据库服务器将优化它出。
您是否将标准SQL查询与您的linq查询进行了比较?哪一个更快,差别有多大?
我不同意上述意见,你的LINQ查询一般是正确的,但是......
的反正40milions记录数据库是相当巨大的 - 你需要的所有数据全部时间?也许某种分区可以将其减少到最常用的记录。
我要走出一条腿,猜测你的where子句中使用的列没有索引。如果是这种情况,那么当查询被实现时,无疑会进行表扫描,这就是为什么它需要这么长时间。
我同意乔恩斯基特,但只是想补充:
生成的SQL 将使用TOP落实采取()。
如果您能够运行SQL-Profiler并以调试模式遍历代码,您将能够准确查看生成的SQL以及执行时间。如果你找到时间来做到这一点,你会学到很多关于下面发生的事情。
还有可以分配一个TextWriter以查看生成的SQL,例如DataContext.Log属性:
dbContext.Log = Console.Out;
另一种选择是用LINQPad进行实验。 LINQPad允许您连接到您的数据源并轻松地尝试不同的LINQ表达式。在结果面板中,您可以切换查看SQL生成的LINQ表达式。
我认为dataContext.table_sample.Where(e => e.x == 1).Take(100)更容易阅读mantain。 SampleTable看起来比table_sample好。 – 2009-08-19 11:02:06
在DataClassesDataContext设计器(.dbml)中,您还可以指定检索哪些列。默认情况下,所有列都被检索(SQL中的SELECT *)。只需点击一个字段并查看其属性即可进行更改。 – 2009-08-19 11:04:49