2013-02-07 100 views
1

我想用linq複製下面的SQL查詢。在SQL Server上需要花費幾分之一秒的運行:加速linq查詢

select g.reference, count(*) 
from isis.dbo.[group] as g inner join 
    isis.dbo.enrolment as e on g.groupid = e.groupid inner join 
    isis.dbo.student as s on e.studentid = s.studentid inner join 
    isis.dbo.progression as p on s.studentid = p.studentid 
where p.academicyear = '12/13' and g.istutorgroup = 1 
group by reference 

在我的MVC應用程序,我想過去「TutorGroups」的上市的看法。對於視圖中的每個導師組,我需要顯示關於他們的各種信息,其中一個項目是他們進行的「進步」訪談的次數。

我已經嘗試了一些方法,但他們都採取向上的30秒在我的MVC應用程序中運行:

<%TTMrequired = tg.Enrolments 
        .SelectMany(e => e.Student.Progressions 
            .Where(p => p.TTMChecked == false && 
               p.TTMInterview == true && 
               p.AcademicYear == year)) 
        .Count(); %> 

<%TTMrequired = tg.Enrolments 
        .Where(e => e.Student.Progressions 
           .Any(p => p.TTMChecked == false && 
             p.TTMInterview == true && 
             p.AcademicYear == year)) 
        .Count(); %> 

任何人有我如何能加快任何建議這起來了嗎?我懷疑問題是我試圖做一個愚蠢的方式 - 通常是!

+0

這些陳述如何相關? SQL版本通過引用查詢「組」表和組。我在LINQ版本中找不到類似的東西。 –

+0

對不起,我應該提供更多的細節 - 我編輯了我的問題,包括細節。該視圖有一個傳遞給它的「導師組」的列表,並通過一個foreach循環遍歷每個學生制定學生對該組進行的「進階」訪問次數。 – Chris

+0

如果這是一個MVC應用程序,爲什麼你在V中這樣做?它應該是模型的一部分。你想用這個查詢來達到什麼目的?回到問題可能有助於隔離更好的解決方案。特別是,我在質疑看起來是「必需」標誌的分組/計數。另外,使用一個分析器來確保你沒有在一個循環內調用它(例如在網格中綁定)。 –

回答

1

你可以嘗試做計數,而不是SelectManySum

tg.Enrolments.Sum(e => e.Student.Progressions 
           .Count(p => p.TTMChecked == false && 
              p.TTMInterview == true && 
              p.AcademicYear == year) 
       ); 
+0

感謝您的建議,只是嘗試過,但不幸的是它需要相同的時間。 – Chris

0

如果使用這種語法來寫:

var TTMRequired = (from g in tg.Groups 
        join e in tg.Enrolment on g.groupid equals e.groupid 
        join s in tg.Students on e.studentid equals s.studentid 
        join p in tg.Progressions on s.studentid = p.studentid 
        where p.academicyear.Equals("12/13") && g.istutorgroup.Equals(1) 
        group g by g.reference into grp 
        select new { 
         grpRef = grp.Key, 
         grpCount = grp.Count() 
        }); 

注:如果g.istutorgroupBIT而不是INT類型,考慮使用.Equals(true)

+0

我基於你的原始SQL查詢的答案。 –