2013-05-16 51 views
1

所以我有一個linq查詢,其中s1.code來自此linq查詢之前的對象。Linq Query Optimization加入表格

var q1 = from cf in db.Control_Franchises 
     join t1 in db.Territories 
      on  SqlFunctions.StringConvert((double)cf.FranchiseID).Trim() 
      equals t1.FranchiseID.Trim() 
     join cu in db.Control_Users on t1.FK_CompanyID equals cu.PrimaryCompanyID 
     join u in db.Users on cu.UserID.ToLower() equals u.Username.ToLower() 
     where cf.Status == "ACTIVE" 
      && cf.FranchiseID > 1000 
      && cu.UserType == "Franchisee" 
      && cu.Status == "ACTIVE" 
      && t1.Province == s1.Code 
     orderby cu.LastName ascending, cf.FranchiseID ascending 
     select new 
     { 
      FranchiseId = cf.FranchiseID, 
      Province = cf.StateCode, 
      DisplayName = cu.LastName + ", " + cu.FirstName, 
      UserId = u.PK_UserID 
     }; 

我有相同的代碼塊,但這次在我的where子句中,我改變了過濾器使用t1.Province == s1.Codecf.StateCode == s1.Code

var q1 = from cf in db.Control_Franchises 
     join t1 in db.Territories 
      on  SqlFunctions.StringConvert((double)cf.FranchiseID).Trim() 
      equals t1.FranchiseID.Trim() 
     join cu in db.Control_Users on t1.FK_CompanyID equals cu.PrimaryCompanyID 
     join u in db.Users on cu.UserID.ToLower() equals u.Username.ToLower() 
     where cf.Status == "ACTIVE" 
      && cf.FranchiseID > 1000 
      && cu.UserType == "Franchisee" 
      && cu.Status == "ACTIVE" 
      && cf.StateCode == s1.Code  // DIFFERENT FROM ABOVE 
     orderby cu.LastName ascending, cf.FranchiseID ascending 
     select new 
     { 
      FranchiseId = cf.FranchiseID, 
      Province = cf.StateCode, 
      DisplayName = cu.LastName + ", " + cu.FirstName, 
      UserId = u.PK_UserID 
     }; 

現在第一次查詢的速度運行10次爲第二一。
雖然我是如何測量速度的,但是我的編輯頁面的加載時間又是加載節點的mvc樹視圖。這個查詢也是不同查詢的一部分。

現在我想了解爲什麼我的第一個查詢加載速度更快,我能想到的唯一推理是因爲我在將要加入的表上執行條件,而不是加入整個「區域」帶有「Control_Franchises」的表格我只加入「Territories」表格的一部分。

有什麼想法?

+1

我沒有看到這兩個查詢......之間的區別是有一個我失蹤了?他們甚至都被命名爲「q1」。 –

+0

'StateCode'和'Province'是什麼類型?兩個字符串?我猜這是檢查美國與非美國的地址或其他...如果是這樣,是否有可能第一個查詢運行得更快,因爲你有更少的非美國條目? –

+1

@DanielHilgarth在'where'中,最後一個'&&'d項是不同的。關於編輯以使這不需要滾動查看... @foop發佈代碼塊時,如果可以的話,根據需要重新流動文本以便在結果代碼塊中沒有水平滾動條是很好的。 – AakashM

回答

3

最有可能的兩個不同的列t1.Provincecf.StateCode在基礎數據源不同的索引(或一個是不是所有)

+0

就是這樣。 *嘆息*用現有系統繼承遺留數據庫的樂趣。 – foop