Запросы LINQ всегда сортируются по значению первичного ключа, даже если предложение orderby явно вызывает сортировку с другим значением

#c# #sql #linq #sql-order-by

Вопрос:

Я работаю над своим первым личным проектом на C# и включаю LINQ для выполнения запросов к базе данных SQL Server. У меня возникла проблема с LINQ, когда запросы всегда сортируют записи, возвращаемые из таблицы, в соответствии со значением их первичного ключа, даже если в запросе существуют предложения orderby.

Моя цель состоит в том, чтобы запросить таблицу, содержащую столбцы для имени и фамилии (оба типа varchar); сортировать по имени; затем сортировать по фамилии. Код проблемы состоит из двух разделов. Первый — это исходный запрос:

 var dayShiftCrew =  from information in context.EmployeeInformations  where information.EmployeeShiftType.Shift == "Day" amp;amp; information.EmployeePositionType.Position == "Crew"  orderby information.EmployeeNamesAndNumber.FirstName, information.EmployeeNamesAndNumber.LastName  select information.EmployeeNamesAndNumber;  

Вторая часть-это оператор foreach, который заполняет другую таблицу результатами запроса:

 foreach (var employee in dayShiftCrew)  {  var position =  from selection in context.EmployeeInformations  where selection.EmployeeID == employee.EmployeeID  select selection.Position;   string query2 = $@"USE Employees; INSERT INTO WeeklySchedule_{month}_{day}_{year} "    @"(EmployeeID, Name, Position) VALUES "    $@"({employee.EmployeeID}, '{employee.FirstName   (" ")   employee.LastName}', '{position.First()}');";   SqlCommand command2 = new SqlCommand(query2, connection);  command2.ExecuteNonQuery();  }  

Когда я просматриваю целевую таблицу после ее заполнения, записи не упорядочиваются в соответствии с предложением orderby запроса. Я выполнял варианты этого кода несколько раз, и каждый раз записи появляются в одной и той же последовательности. Последовательность в таблице назначения совпадает с последовательностью в исходной таблице, что наводит меня на мысль, что либо запрос сортируется по значению первичного ключа записей, либо вообще не сортируется и просто возвращает записи в их исходной последовательности.

Я уверен, что есть что-то, что я упускаю из виду, но я некоторое время экспериментировал с этим кодом и не могу найти решение для правильной сортировки. Я пробовал оба вида синтаксиса для запросов LINQ; пробовал использовать одно правило orderby вместо двух; и переписывал строки для немедленного, а не отложенного выполнения.

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

Комментарии:

1. Если вы запросите таблицу без указания порядка, база данных может возвращать записи в любом порядке. Но обычно возвращает строки в порядке индекса. Таблица может иметь кластеризованный индекс, что означает, что строки таблицы отсортированы так же, как и этот индекс. Первичный ключ обычно кластеризуется. Это включает в себя ваш запрос целевой таблицы.

2. @JeremyLakeman это был полезный ответ; Я относительно новичок в работе с базами данных, и этот проект является для меня способом получить практический опыт. Я посмотрел кластеризованные индексы и обнаружил, что именно поэтому я каждый раз вижу одну и ту же последовательность. Все, что мне нужно было сделать, — это пересмотреть интерполированную строку, чтобы новый первичный ключ просто увеличивался для каждой записи. Теперь сортировка работает по назначению. Спасибо!

3. @MegaZeo165, на самом деле вы можете вставлять записи в другую базу данных в одном запросе LINQ, но для этого требуется стороннее расширение, если вам интересно, я могу предложить решение.

4. INSERT INTO WeeklySchedule_{month}_{day}_{year} — вы храните в имени таблицы информацию, которую вы должны хранить в столбце, и, следовательно, обрекаете себя на повторение этого (уродливого, небезопасного) шаблона в любое время, когда вы хотите работать с сущностями, связанными с этой таблицей. Как бы то ни было, ваш код развалится, как только вы получите своего первого человека по имени О’Лири, и действительно вызовет проблему, когда появится Бобби Таблз

5. @CaiusJard Первые три параметра в строке могут принимать только аргументы, переданные из элемента управления MonthlyCalendar (приложение использует WinForms). Все поля в приложении, которые могут принимать ввод текста, передаются в виде дословных строк и проверяются на соответствие регулярным выражениям; как таковые, Robert’); ВЫПАДАЮЩАЯ ТАБЛИЦА WeeklySchedule_12_-_2021; — никогда не будет принята в качестве записи в поле или комбинации полей. Этот процесс выполняется до вызова метода, содержащего эту строку запроса. Вы предполагали, что я не буду давать Бобби Таблицы его экзаменов при создании приложения?