Я работаю в .NET Core 2.0 MVC с Entity Framework и пытаюсь преобразовать оператор SQL в запрос EF.Вот исходный SQL:
SELECT
t.LastName, FirstName, t.teacherId
,courseCode
,classSection
,roomId
,number
,DayID
,periodId
FROM Classes cl
INNER JOIN Courses cr on cr.courseId = cl.courseId
INNER JOIN vwClassSchedule cs on cs.ClassId = cl.classId
LEFT OUTER JOIN Teachers t on t.TeacherID = cl.teacherId
LEFT OUTER JOIN(select classid, count(classid) as number
from CourseEnrollment group by classId) ce on cl.classId = ce.classId
order by LastName, dayId, periodId
Последнее ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ - моя проблема.Я не нашел решение, которое работает хорошо.Вот заявление EF, с которым я до сих пор выступал:
var Courses = _Context.Classes
.Include(t => t.Teachers)
.Include(c => c.Courses)
.Include(s => s.ClassSchedule)
.OrderBy(t => t.Teachers.LastName)
.ThenBy(s => s.ClassSchedule.DayID)
.ThenBy(s => s.ClassSchedule.PeriodID)
.Select(p => new ClassDTO
{
TeacherId = p.teacherId,
FirstName = p.Teachers.FirstName,
LastName = p.Teachers.LastName,
Course = p.Courses.courseCode,
Section = p.classSection,
Room = p.roomId,
Students = 0,
Day = p.ClassSchedule.DayID,
Block = p.ClassSchedule.PeriodID,
ClassId = p.classId
})
.ToList();
Единственное работоспособное решение, которое я нашел, - это циклически просматривать результаты курсов и рассчитывать количество студентов для каждого результата, и этоогромный убийца производительности.Оригинальный SQL выполняется менее чем за секунду, тогда как мой второй цикл занимает почти 30 секунд.Должен быть лучший способ.