Linq查询优化表的连接

时间:2013-05-16 14:09:50

标签: asp.net-mvc performance linq

所以我有一个linq查询,其中s1.code来自此linq查询之前的对象。

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.Code更改为cf.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树视图。此查询以及不同查询的部分。

现在我试图理解为什么我的第一个查询加载得更快,我能想到的唯一推理是因为我在一个将要加入的表上做一个条件,所以而不是加入整个“Territories”表使用“Control_Franchises”我只加入“Territories”表的一部分。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

很可能两个不同的列t1.Provincecf.StateCode在基础数据源中的索引方式不同(或者根本不是一个)