Сортировать запрос Linq - PullRequest
       3

Сортировать запрос Linq

0 голосов
/ 05 ноября 2018

Я пытаюсь отсортировать следующий запрос Linq, используя поле из таблицы с именем priority.

foreach (var faculty in specialty.faculty_specialties.Where(f => f.faculty.active))

Я попытался добавить: .OrderByDescending(p => p.priority) в конец, но безуспешно. Я использую C # и Visual Studio в проекте MVC. Спасибо

1 Ответ

0 голосов
/ 06 ноября 2018

Для начала разбейте свою логику на отдельные операции, а не пытайтесь записать все в одну строку. Компиляторы - это умные куки, поэтому они хорошо оптимизируют вещи, поэтому нет смысла затруднять чтение / понимание вашего кода:

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() следует заранее ограничить размер результата и поддержку подкачки, если только размер системы не будет ограничен разумным числом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...