2010-01-11 64 views
2

在查找如何執行與LINQ-to-SQL相當的SELECT TOP 5時,我所見過的所有答案都表明使用.Take()所以:通過「SELECT TOP {x}」查詢獲得LINQ to SQL性能

var myObject = (
from myObjects in repository.GetAllMyObjects() 
select myObject) 
.Take(10); 

我還不知道大部分的LINQ是如何工作的幕後的,但我的C類語言的理解,這將首先分配包含所有記錄的臨時數組,然後複製解決var中的前10個元素。如果您正在處理一個小數據集或沒有任何性能限制,但沒有這樣的問題,但對於我來說,如果您選擇可包含數百萬條記錄的表中的最近5個日誌條目,那麼看起來效率極低。

我的理解是如何工作的錯誤?如果是這樣,有人可以解釋實際發生了什麼?否則,只有通過LINQ-to-SQL選擇x條記錄的方式(如果有的話)更好(即更高效)的方式?

[編輯]

我假設myObject的課堂上發LINQ到SQL輸出到調試輸出按在接受答案的建議。我結束了從這裏使用DebuggerWriter:http://www.u2u.info/Blogs/Kris/Lists/Posts/Post.aspx?ID=11

+2

在您的調試器中,您可以檢查Linq對象,它會向您顯示它將執行的SQL查詢。也許這會有幫助? – 2010-01-11 02:35:59

回答

3

你的假設是不正確的。使用Linq to SQL,它的計算結果爲Expression<Func<...>>,可以對其進行評估並生成正確的SQL。您不必擔心它會加載所有記錄。

此外,請參閱以下問題。您可以將流附加到DataContext並查看生成的SQL。 How to get the TSQL Query from LINQ DataContext.SubmitChanges()

+0

數據上下文輸出記錄是一個很棒的提示! – nathanchere 2010-02-23 00:11:36

1

LINQ使用延遲執行,並且對於LINQ-to-SQL表達式樹。

在您枚舉Take調用的結果之前,不會執行任何查詢,因此您無需擔心任何事情。

1

我剛剛經歷了這個最後一週!我在我的開發數據庫上打開了SQL分析器,並逐步完成代碼。查看爲各種查詢生成的SQL非常有趣。我建議你也這樣做。它可能不是您的問題的確切答案,但您可以根據調用的內容瞭解各種組件如何生成完全不同的SQL語句,這當然很有啓發性。

我相信在MSDN上讀取「延遲查詢分辨率」或什麼(?)也是很有啓發性的。

+2

我正在使用SQL Express數據庫,因此,據我所知,在這種情況下,我沒有SQL Profiler :( – nathanchere 2010-01-11 04:40:11