Здравствуйте!
В своем проекте часто приходится работать с 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();
Стоит ли заменить огромные непонятные куски кода на табличные функции или лучше оставить всё на своих местах?