Linq: Skip в сочетании с OrderBy -> проблемы?
От: J_K  
Дата: 04.02.11 18:51
Оценка:
Здравствуйте!
Обнаружился на днях в системе баг — оказалось, что пейджинг на странице не работает как надо. При сортировке по некоторым столбцам показывает меньше количество записей, чем есть на самом деле. И вот что оказалось...
Код (в сокращенном виде) примерно такой:

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<>, а он не поддерживает строки в качестве имен столбцов, и выражения надо строить на лету. Поправьте меня, если это не так. Хотя это уже совсем другая история.

Кто-нибудь может объяснить, почему делая сортировку со скипом, мы не можем быть уверены в конечном результате, если значения повторяются?

Спасибо
Life is very short and there's no time
for fussing and fighting... (C) Paul McCartney & John Lennon
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.