[英]What is the fastest way to sort an EF-to-Linq query?
從理論上講,使用實體框架會更快:
// (1) sort then select/project
// in db, for entire table
var results = someQuery
.OrderBy(q => q.FieldA)
.Select(q => new { q.FieldA, q.FieldB })
.ToDictionary(q => q.FieldA, q => q.FieldB);
要么
// (2) select/project then sort
// in db, on a smaller data set
var results = someQuery
.Select(q => new { q.FieldA, q.FieldB })
.OrderBy(q => q.FieldA)
.ToDictionary(q => q.FieldA, q => q.FieldB);
要么
// (3) select/project then materialize then sort
// in object space
var results = someQuery
.Select(q => new { q.FieldA, q.FieldB })
.ToDictionary(q => q.FieldA, q => q.FieldB)
.OrderBy(q => q.FieldA); // -> this won't compile, but you get the question
我不是SQL專家,但直覺上似乎2比1快...是正確的嗎? 並將其與3進行比較,因為以我在EF方面的經驗,在db上完成時幾乎所有操作都更快。
PS:我的環境中沒有性能工具,也不確定如何進行測試,因此是一個問題。
調用ToDictionary
,查詢正在編譯並正在執行,因此1和2應該相同並且產生相同的查詢:在兩種情況下SELECT FieldA, FieldB FROM table ORDER BY FieldA
您都會得到一個SELECT FieldA, FieldB FROM table ORDER BY FieldA
。
第三點不同:首先執行SQL查詢(不帶ORDER BY
子句),然后對返回的內存集進行排序(數據不是由DB提供程序排序,而是由客戶端排序)。 這可能更快或更慢,具體取決於數據量,服務器和客戶端的硬件以及數據庫的設計方式(索引等),網絡基礎結構等等。
無法通過您提供的信息來判斷哪個會更快
PS:這毫無意義,因為Dictionary
並不真正在乎順序(我不認為3會因為Dictionary<>
而編譯,如果我沒記錯的話,它沒有OrderBy
),但是將ToDictionary
更改為ToList
並有你的表現答案
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.