2016-11-25 79 views
1

我有哪裏取決於用戶的選擇在哪裏/我加入有條件更添加過濾器。多凡VS內加入

哪種方法比其他爲什麼快?與

var queryable = db.Sometable.Where(x=> x.Id > 30); 
queryable = queryable.Where(x=> x.Name.Contains('something')); 
var final = queryable.ToList(); 

實施例加入:

與在實施例

var queryable1 = db.Sometable.Where(x=> x.Id > 30); 
var queryable2 = db.Sometable.Where(x=> x.Name.Contains('something')); 
var final = (from q1 in queryable1 join q2 in queryable2 on q1.Id equals q2.Id select q1).ToList(); 

注:我寧願多個Where但如在描述導致錯誤question。因此不得不轉移到JOIN。希望「加入」的代碼並不比多慢WHERE

+0

這是產生錯誤的確切代碼的性能問題?你能分享嗎? – Aheho

+0

@Aheho是的,我只改變了變量名稱。 –

回答

0

我相信你已經明白你的LINQ代碼轉換成SQL語句。你的第一個查詢將導致類似:

SELECT * FROM Sometable WHERE Id > 30 AND Name LIKE '%something%' 

你的第二個查詢會導致類似

SELECT q1.* 
FROM Sometable q1 
    JOIN Sometable q2 ON q1.Id = q2.Id 
WHERE q1.Id > 30 AND q2.Name LIKE '%something%') 

幾乎所有的時間,從一個單一的一個選擇會返回結果比一個快2個表之間的連接。

如果LINQ語句無法添加表時,一定要包括他們。

var queryable = db.Sometable.Include(i => i.ForeignTable).Where(x=> x.Id > 30); 
+0

我剛剛編輯了問題以包含更多信息。請檢查** NOTE **部分 –

2

我只是試圖運行類似的LINQ語句針對MSMQL 2008數據庫表與1000萬行。我發現查詢優化器將這兩個語句轉換爲類似的查詢計劃,並且性能差異很大。

我要說的是誰的人正在讀碼,第一個例子中更明確指出你的意圖,因此將是首選。評估代碼時,很多時候性能不是選擇的最佳指標。

+0

我剛剛編輯了問題以包含更多信息。請檢查** NOTE **部分 –

0

我對子級去的where子句,避免自我加入同一個表,使代碼更清晰

您可以將日誌添加到您的DbContext查看生成的SQL查詢

db.context.Database.Log = System.Diagnostic.Debug.WriteLine; 

反正以提高查詢性能我就要:

  1. 只選擇真正需要的字段(不是*)

  2. 檢查表的索引

  3. 你確實需要包含語句嗎?如果記錄成長了很多,你將與SQL爲「像‘%XXX%’」
+0

我剛剛編輯了問題以包含更多信息。請檢查** NOTE **部分 –