Для начала разбейте свою логику на отдельные операции, а не пытайтесь записать все в одну строку. Компиляторы - это умные куки, поэтому они хорошо оптимизируют вещи, поэтому нет смысла затруднять чтение / понимание вашего кода:
var facultySpecialties = specialty.faculty_specialties
.Where(fs => fs.faculty.active)
.ToList(); // Executes the query to retrieve faculty specialties.
foreach(var facultySpecialty in facultySpecialties)
{
// do stuff.
}
Помните о том, какие сущности вы упоминаете в своих запросах. Приведенный выше запрос будет возвращать faculty_specialties, а не faculty. Нужно остерегаться: поскольку это возвращает fac_specs, если вы хотите получить доступ к деталям из fac_spec и факультета в цикле foreach, тогда. Включите также факультет.
var facultySpecialties = specialty.faculty_specialties
.Include(fs => fs.faculty)
.Where(fs => fs.faculty.active)
.ToList();
Если вам нужны только факультеты, и вам не нужна информация из fac_spec:
var faculties = specialty.faculty_specialties
.Select(fs => fs.faculty)
.Where(f => f.active)
.ToList();
Это выбирает факультет из наших fac_specs. Обратите внимание, что предложение Where изменяется, потому что область после .Select()
становится Faculty вместо Faculty_Specialities. Если вам все еще нужны подробности из fac_specs, вы можете использовать .Include(f => f.faculty_specialties)
, однако не включайте отношения, если они не нужны, поскольку это увеличивает затраты производительности и стоимость (размер) передачи запросов.
Теперь вы хотите заказать факультеты. Вопрос в том, к какой организации применяется приоритет? Если Приоритет является полем на факультете, то:
var faculties = specialty.faculty_specialties
.Select(fs => fs.faculty)
.Where(f => f.active)
.OrderBy(f => f.Priority)
.ToList();
Однако я подозреваю, что приоритет отдается faculty_speciality.
Если у вас есть свойства навигации от faculty обратно к faculty_specialities (я предполагаю, что отношение «многие ко многим», так что faculty может иметь ICollection<faculty_specialities>
сопоставленный), и факультеты являются DbSet в вашем контексте, вы можете реструктурировать запрос, так как это немного упростит заказ:
var faculties = dbContext.Faculties
.Where(f => f.active && f.faculty_specialties.Any(fs => fs.specialty.specialtyId == specialty.specialtyId))
.ToList();
Выполнить заказ можно по факсимиле: faculty_speciality.priority:
var faculties = dbContext.Faculties
.Where(f => f.active
&& f.faculty_specialties.Any(fs => fs.specialty.specialtyId == specialty.specialtyId))
.OrderByDescending(f => f.faculty_specialties.Min(fs => fs.priority))
.ToList();
Вы можете попробовать упорядочить исходный запрос следующим образом:
var faculties = specialty.faculty_specialties
.OrderBy(fs => fs.priority)
.Select(fs => fs.faculty)
.Where(f => f.active)
.ToList();
Однако я не уверен, что эта сортировка будет выполнена вплоть до окончательного набора результатов.
И последнее, что следует учитывать при таких запросах, это то, что по мере роста систем количество данных может сделать такие операции очень дорогими, так как количество объектов для данной специальности увеличивается. При использовании .Take()
и .Skip()
следует заранее ограничить размер результата и поддержку подкачки, если только размер системы не будет ограничен разумным числом.