EF Codefirst и Linq - логическая проблема OrderBy - PullRequest
2 голосов
/ 21 февраля 2012

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

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

Ответы [ 2 ]

1 голос
/ 26 июня 2014

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

DbContext.Records.Select(t=> new {data = t, isRead = t.Foo == null ? 0 : 1})
.OrderBy(t=> t.isRead)
.Select(t=> t.data).ToList();
0 голосов
/ 03 марта 2012

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

Или любой другой порядок, в котором все рекомендуемые объекты идут первыми.

Но для правильной работы Skip и Take в LINQ to Entities (и во многих других реализациях LINQ) порядок строк должен бытьполностью определяется.Вот почему изменение, которое вы указали в своем комментарии, появилось, чтобы исправить проблему.Однако проблема может быть не решена, если комбинация свойств, которые вы сортируете, не гарантируется как уникальная.

Один из способов убедиться, что вы получите полностью определенный заказ, - это использовать основнойключ как вторичное свойство для заказа по.Если снова взять приведенный выше пример, это всегда приведет к следующему порядку:

Id  Name  IsRecommended
1   C     true
3   B     true
4   A     true
2   D     false
5   E     false

, а Skip and Take будет работать последовательно.

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