2009-08-18 326 views
20

如何使用Linq返回前100条记录?使用Linq选择前100条记录

我有一张拥有4000万条记录的表格。

此代码的工作,但它是缓慢的,因为将过滤器之前返回的所有值:

var values = (from e in dataContext.table_sample 
       where e.x == 1 
       select e) 
      .Take(100); 

是否有返回过滤的方法吗?像T-SQL TOP子句一样?

+0

我认为dataContext.table_sample.Where(e => e.x == 1).Take(100)更容易阅读mantain。 SampleTable看起来比table_sample好。 – 2009-08-19 11:02:06

+0

在DataClassesDataContext设计器(.dbml)中,您还可以指定检索哪些列。默认情况下,所有列都被检索(SQL中的SELECT *)。只需点击一个字段并查看其属性即可进行更改。 – 2009-08-19 11:04:49

回答

25

不,在过滤之前不会返回所有值。 Take(100)将最终成为发送的SQL的一部分 - 很可能使用TOP。

当然,当你指定orderby子句时,这样做更有意义。

LINQ在到达查询表达式的末尾时不会执行查询。只有在调用聚合运算符(例如CountAny)或者开始遍历结果时,它才会发送任何SQL。即使调用Take也不会实际执行查询 - 例如,您可能希望在后面进行更多的筛选,最终可能会成为查询的一部分。

当您开始迭代结果时(通常使用foreach) - 当SQL将实际发送到数据库时。

(我想你的where条款是有点坏了,顺便说一下,如果你有你的真正的代码问题,这将有助于看到代码接近现实越好。)

+0

Tks,代码已更正。 – Zanoni 2009-08-18 21:07:03

+1

不完全不是 - 我认为你的意思是“其中e.x == 1” – 2009-08-18 21:25:52

+0

你说得对,正确。 – Zanoni 2009-08-19 12:30:26

2

我在进入前100名之前,不要认为你是正确的返回所有记录。我认为Linq决定执行查询时SQL字符串将会是什么(又名Lazy Loading),并且你的数据库服务器将优化它出。

2

您是否将标准SQL查询与您的linq查询进行了比较?哪一个更快,差别有多大?

我不同意上述意见,你的LINQ查询一般是正确的,但是......

    在你的“其中”条款可能应该为x == 1 X不等于1(比较,而不是分配
  • 'select e'将返回您可能只需要其中一部分的所有列 - 使用select子句更加精确(仅键入所需的列); “SELECT *”是资源
  • 确保你的数据库是很好的索引的vaste,并尝试使用索引的数据

的反正40milions记录数据库是相当巨大的 - 你需要的所有数据全部时间?也许某种分区可以将其减少到最常用的记录。

1

我要走出一条腿,猜测你的where子句中使用的列没有索引。如果是这种情况,那么当查询被实现时,无疑会进行表扫描,这就是为什么它需要这么长时间。

2

我同意乔恩斯基特,但只是想补充:

  1. 生成的SQL 使用TOP落实采取()。

  2. 如果您能够运行SQL-Profiler并以调试模式遍历代码,您将能够准确查看生成的SQL以及执行时间。如果你找到时间来做到这一点,你会学到很多关于下面发生的事情。

  3. 还有可以分配一个TextWriter以查看生成的SQL,例如DataContext.Log属性:

    dbContext.Log = Console.Out;

  4. 另一种选择是用LINQPad进行实验。 LINQPad允许您连接到您的数据源并轻松地尝试不同的LINQ表达式。在结果面板中,您可以切换查看SQL生成的LINQ表达式。