2012-02-21 2 views
2

Im пытается упорядочить мои данные с помощью логического значения (IsSposed). Но иногда этот запрос получает результат 20, иногда 40. Я не понимаю, в чем проблема. Затем я изменил порядок. Например, когда я заказываю «Название», я не вижу этой проблемы. Я действительно смутился. В чем проблема и что я могу сделать, чтобы сначала получить рекомендованные предложения?EF Codefirst и Linq - OrderBy boolean issue

db.Deal 
    .Include("Store") 
    .Include("Like") 
    .Include("Comment") 
    .OrderByDescending(d => d.IsRecommend) 
    .Skip((syf - 1) * 20) 
    .Take(20) 
    .ToList() 
+0

Проверили ли вы сгенерированный SQL? – Eranga

+0

Да и запрос - это нормально. Я вижу эту проблему только при булевом упорядочении. –

+3

Я не вижу, как вы можете получить 40 результатов, если вы принимаете 20. Это действительно ваш точный оператор LINQ? – devuxer

ответ

0

Проблема заключается в том, что использование 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 

и Пропустить Брать и будет работать стабильно.

1

мне нужно сделать заказ на логическое значение, и это было мое решение

DbContext.Records.Select(t=> new {data = t, isRead = t.Foo == null ? 0 : 1}) 
.OrderBy(t=> t.isRead) 
.Select(t=> t.data).ToList();