2009-08-18 115 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表達式。