如何使用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