Проблема заключается в том, что использование OrderBy с одним булевым свойством не обеспечивает полного упорядочения результатов. Вместо этого он делит результаты на две половины с неопределенным упорядочением в двух половинах. Так, например, если у вас объект с Id, Name и IsRecommended свойств, и вы просто порядке по IsRecommended, то вы можете получить этот заказ:
Id Name IsRecommended
4 A true
3 B true
1 C true
2 D false
5 E false
Но вы можете также получить
Id Name IsRecommended
3 B true
1 C true
4 A true
5 E false
2 D false
Или любой другой заказ, в котором все рекомендуемые объекты будут первыми.
Но для прокрутки и принятия для корректной работы в LINQ to Entities (и многих других реализациях LINQ) упорядочение строк должно быть полностью определено. Вот почему изменение, указанное в вашем комментарии, появилось, чтобы устранить проблему. Однако проблема не может быть фактически устранена, если комбинация свойств, которые вы сортируете, не является уникальной.
Одним из способов обеспечения полного получения заказа является использование первичного ключа в качестве вторичного имущества для заказа. На примере выше опять же, это всегда приводит в следующем порядке:
Id Name IsRecommended
1 C true
3 B true
4 A true
2 D false
5 E false
и Пропустить Брать и будет работать стабильно.
Проверили ли вы сгенерированный SQL? – Eranga
Да и запрос - это нормально. Я вижу эту проблему только при булевом упорядочении. –
Я не вижу, как вы можете получить 40 результатов, если вы принимаете 20. Это действительно ваш точный оператор LINQ? – devuxer