1

次の SQL クエリを linq で複製しようとしています。SQL Server では、実行に数分の 1 秒かかります。

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」のリストをビューに渡しています。ビュー内の各家庭教師グループについて、それらに関するさまざまな情報を表示する必要があります。1 つの項目は、彼らが受けた「進行」インタビューの数です。

いくつかの方法を試しましたが、どちらも MVC アプリケーションで実行するのに 30 秒以上かかります。

<%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(); %>

これをスピードアップする方法について誰か提案がありますか? 問題は、私が愚かな方法でやろうとしていることにあると思います-通常はそうです!

4

2 に答える 2

1

Sum:の代わりにカウントの実行を試みることができますSelectMany

tg.Enrolments.Sum(e => e.Student.Progressions
                                .Count(p => p.TTMChecked == false && 
                                            p.TTMInterview == true && 
                                            p.AcademicYear == year)
                  );
于 2013-02-07T16:39:06.173 に答える
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.istutorgroupタイプの場合は、 の使用を検討してください。BITINT.Equals(true)

于 2013-02-07T16:45:19.170 に答える