Стоит ли в данном случае использовать табличные функции вместо LINQ to SQL?

Здравствуйте!
В своем проекте часто приходится работать с sql-запросами.
На данный момент я использую LINQ to SQL, чтобы получить необходимые данные из БД, но структура кода оставляет желать лучшего. Ниже приведен фрагмент одного из таких запрсоов.
var query = (from table1 in (
                                (from Students in db.Students
                                 group Students by new
                                 {
                                     Students.GroupNumber
                                 } into g
                                 select new
                                 {
                                     Grp = g.Key.GroupNumber,
                                     Kol_dolgnikov = g.Count(p => p.RecordBookNumber != null)
                                 }))
                             join table2 in (
                                 (from t1 in (
                                     (from Students in db.Students
                                      from StudentsSubjects in db.StudentsSubjects
                                      where
                                      Students.RecordBookNumber == StudentsSubjects.StId.ToString()
                                      group new { Students, StudentsSubjects } by new
                                      {
                                          Students.RecordBookNumber,
                                          Students.GroupNumber
                                      } into g
                                      where g.Count(p => p.StudentsSubjects.SubjId != null) > 2
                                      select new
                                      {
                                          Grp = g.Key.GroupNumber,
                                          Rbn = g.Key.RecordBookNumber,
                                          Kol_dolg = g.Count(p => p.StudentsSubjects.SubjId != null)
                                      }))
                                  group t1 by new
                                  {
                                      t1.Grp
                                  } into g
                                  select new
                                  {
                                      g.Key.Grp,
                                      Kol_dol_bol2 = g.Count(p => p.Rbn != null)
                                  })) on table1.Grp equals table2.Grp into table2_join
                             from table2 in table2_join.DefaultIfEmpty()
                             select new DebtorsReportModel
                             {
                                 StudentGroupNumber = table1.Grp,
                                 SoftDebtorsCount = (int?)table1.Kol_dolgnikov ?? (int?)0,
                                 HardDebtorsCount = (int?)table2.Kol_dol_bol2 ?? (int?)0
                             }).ToList();

Кроме того, есть и довольно неплохие на мой взгляд.
var query = (from Students in db.Students
                             from StudentsSubjects in db.StudentsSubjects
                             from Subjects in db.Subjects
                             from ControlPeriods in db.ControlPeriods
                             from ControlTypes in db.ControlTypes

                             where
                               Students.RecordBookNumber == StudentsSubjects.StId.ToString()
                             where
                             Subjects.SubjectId == StudentsSubjects.SubjId
                             where
                             ControlPeriods.ControlPeriodId == StudentsSubjects.CtrlPeriodId
                             where
                             ControlTypes.ControlTypeId == StudentsSubjects.CtrlTypeId
                             select new SubjectsReportModel
                             {
                                 StudentGroupNumber = Students.GroupNumber,
                                 StudentFullName = string.Concat(Students.LastName, " ", Students.FirstName, " ", Students.MiddleName),
                                 SubjectName = Subjects.Name,
                                 ControlPeriodName = ControlPeriods.Name,
                                 ControlTypeName = ControlTypes.Name,
                                 Date = StudentsSubjects.FileDate
                             }).ToList();

Стоит ли заменить огромные непонятные куски кода на табличные функции или лучше оставить всё на своих местах?
  • Вопрос задан
  • 181 просмотр
Решения вопроса 1
@d-stream
Готовые решения - не подаю, но...
Как уже отметили linq2sql в данном случае как морская свинка (не в море и не хрюкает).
И самое главное прилетает это в sql так, что планировщик/оптимизатор оказывается в затруднении.

Как итог - потеря производительности.

Посему правильный путь - построение хранимых процедур и linq-оперирования с уже отобранными оптимальным образом результатами выполнения процедур.

Это может показаться не по-книжке и не по феншую теоретических измышлений, но эффективно.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@nightwolf_du
5 лет опыта. c#, js, sql.
По опыту - sql нотация в linq - большое зло. Страшно, непонятно, не код и не sql-запрос.
Многими правилами оформления кода это запрещено.

Плюс первый запрос я бы вообще переписал на хранимку в случае более чем 100к записей в базе.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы