У меня есть приложение ASP.NET MVC, которое я уже некоторое время использую с LINQ to SQL. У меня есть навык репликации большинства запросов в LINQ, но есть один, который поставил меня в тупик на несколько дней.
Я пытаюсь выбрать список «Прогрессий», где выполняется условие, и у меня есть список групп.
Мой ERD выглядит следующим образом:
«Группа» 1 <-> Много «Зачислений» Много <-> 1 «Студентов» 1 <-> Много «Прогрессий»
И стандартный SQL будет (за исключением того, что в коде у меня есть определенный набор групп, переданных в функцию):
SELECT dbo.[Group].GroupID, COUNT(*) AS returning
FROM dbo.[Group] INNER JOIN
dbo.Enrolment ON dbo.[Group].CourseID = dbo.Enrolment.GroupID INNER JOIN
dbo.Student ON dbo.Enrolment.StudentID = dbo.Student.StudentID INNER JOIN
dbo.Progression ON dbo.Student.StudentID = dbo.Progression.StudentID
WHERE (dbo.Progression.IsReturning = 0)
GROUP BY dbo.[Group].GroupID
Теперь для веб-приложения. ASP-представление «Progression» получает переменную «groups», которая представляет собой список нескольких выбранных групп. В настоящее время я использую следующий код, который очень медленный (30 секунд или более для загрузки страницы)
<%foreach (var tg in Model)
{%>
<% notreturning = 0; %>
<%foreach (Enrolment e in tg.Enrolments)
{
notreturning = notreturning + e.Student.Progressions.Where(p => !p.IsReturning).Count();
}%>
<tr>
<td><% = notreturning %></td>
</tr>
<%
} %>
Я тоже считаю кое-что, но в этом примере я остановлюсь на одном. Теперь очевидно, что это довольно медленно, потому что он должен делать foreach для групп, а затем для каждого зачисления в группу, так что около 10 групп по 20 студентов в каждой. Я действительно хочу сделать что-то вроде следующего, которое устраняет второй foreach:
<%foreach (var tg in Model)
{%>
<% notreturning = 0; %>
<%var test = tg.Enrolments.Where(e => e.Student.Progressions.Where(p => !p.IsReturning)).Count(); %>
<tr>
<td><% = notreturning %></td>
</tr>
<%
} %>
Этот код не работает как вложенный оператор where, который не возвращает тип данных bool, но я надеюсь, что он перебирает то, что я пытаюсь сделать здесь.
Я не уверен, хорошо ли я объяснил это, но если у кого-то есть какие-либо идеи, я был бы очень благодарен, это беспокоило меня в течение многих дней!