Поле сортировки по smalldatetime дает разные результаты на SQL-сервере и в C # (Entity Framework) - PullRequest
0 голосов
/ 09 января 2019

У меня есть таблица с полем LastChange типа smalldatetime. Когда я сортирую по возрастанию в этом поле, я получаю следующее:

enter image description here

Я создал объект, соответствующий этому, в Entity Framework. Тип поля LastChange: DateTime.

Когда я выполняю такую ​​же операцию сортировки, как это:

teams.OrderBy(x => x.LastChange).Select(x => x.TeamID)

Я получаю следующий результат:

[0]: 158
[1]: 161
[2]: 159
[3]: 160
[4]: 165
[5]: 163
[6]: 166
[7]: 167
[8]: 168
[9]: 169
[10]: 170
[11]: 171
[12]: 1172
[13]: 162
[14]: 164
[15]: 172

Почему 2 результата отличаются? Это потому, что значения LastChange одинаковы для нескольких записей? Или это как-то связано с типом smalldatetime

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Это потому, что поле LastChange одинаково для нескольких строк. Попробуйте это:

SELECT *
FROM YourTable
ORDER BY LastChange, TeamID;

teams.OrderBy(x => x.LastChange).ThenBy(x => x.TeamID).Select(x => x.TeamID)

В обоих местах вы получите абсолютно одинаковые результаты. Если вы не укажете порядок для второго поля, в SQL будет показан случайный результат (для полей, не указанных), обычно он такой же, но может быть совершенно другим.

0 голосов
/ 09 января 2019

Это потому, что значения LastChange одинаковы для нескольких записей?

Да. Ни c #, ни база данных не будут пытаться отсортировать результаты после сортировки LastChange, поэтому для любых одинаковых значений LastChange строки в этом наборе могут быть в любом порядке, согласованности не будет - однажды они будут порядок будет таким, и позже, если БД реорганизовал данные в таблице, они будут иметь другой порядок. C # вполне может упорядочить вещи совершенно по-другому как побочный эффект от того, как работает остальная часть алгоритма сортировки. Нет гарантии, что db и c # всегда будут сортироваться одинаково; каждый из них сдастся, когда сортировка настолько хороша, насколько это возможно для LastChange

Если вам всегда нужны данные в определенном порядке, вы должны точно их отсортировать. Если самим данным не нужно ничего упорядочивать, то это непротиворечиво, вы должны написать свою собственную систему сортировки или предоставить дополнительные данные

Например, если мы всегда хотели, чтобы эти данные были из таблицы БД, содержащей только имена:

Tim
James
John

Это не алфавитный, обратный алфавитный, алфавитный по второму символу, он не отсортирован по длине и т. Д. В этих данных нет ничего, что мы могли бы отсортировать с точки зрения самих данных, поэтому нам придется:

ORDER BY 
  CASE personname
    WHEN 'Tim' THEN 0
    WHEN 'James' THEN 1
    WHEN 'John' THEN 2
  END

Здесь мы буквально преобразовали наши данные в сортируемую вещь

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

Или это как-то связано с типом smalldatetime?

Нет, это влияет на все сортируемые наборы данных, где более чем одна строка имеет одинаковое значение, и ничто больше не помогает алгоритму сортировки выбирать, какая из идентичных строк должна идти первой

0 голосов
/ 09 января 2019

Оба результата верны. Вы ожидаете порядок сортировки только по столбцу «LastChange». Благодаря точности (в минутах) столбца LastChange вы получаете правильный результат. Sql или c # не беспокоятся о других данных в выбранном вами примере. Добавьте второй параметр порядка или увеличьте входную прецессию для столбца LastChange.

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