Здравствуйте!
Обнаружился на днях в системе баг — оказалось, что пейджинг на странице не работает как надо. При сортировке по некоторым столбцам показывает меньше количество записей, чем есть на самом деле. И вот что оказалось...
Код (в сокращенном виде) примерно такой:
query = query.OrderBy(sortColumnName);
return query.Skip(startRow).Take(max).ToList()
Так вот, оказалось, что если столбец содержит повторяющиеся значения, то скип работает совершенно непредсказуемо.
Т.е. всего например значений больше 700, то где-то с третьей страницы уже ничего нет:
q.Skip(300).Take(100).Count()
100 --Ок
q.Skip(400).Take(100).Count()
0 --Куда делись значения??? Ведь их же больше 700, я это знаю совершенно точно:
q.Take(1000).Count()
759
Проблема решается "легко" — просто добавить дополнительную сортировку по столбцу, где все значения уникальны, например, DateTime. Кул, только конструкция order by col1, col 2 не дает нужного результата почему-то. Нужный результат получается только при использовании ThenBy. Кул, только ThenBy доступен только в IQueryable<>, а он не поддерживает строки в качестве имен столбцов, и выражения надо строить на лету. Поправьте меня, если это не так. Хотя это уже совсем другая история.
Кто-нибудь может объяснить, почему делая сортировку со скипом, мы не можем быть уверены в конечном результате, если значения повторяются?
Спасибо