2015-10-01 5 views
1

Я пытаюсь получить отсортированный список с использованием LINQ и Entity Framework, и я получаю некоторые действительно странные результаты. Мой код выглядит примерно так:Weird LINQ OrderBy Behavior

// My class that corresponds to a database table 
class MyClass 
{ 
    public string FirstField { get; set; } 
    public string SecondField { get; set; } 
    public string ThirdField { get; set; } 
} 

// My Entity Framework code 
List<MyClass> firstList = (from p in context.myObjects select p).OrderBy(p => p.FirstField).ToList(); 
List<MyClass> secondList = firstList.OrderBy(p => p.FirstField).ToList(); 

Когда я смотрю на мои результаты, secondList сортируется правильно, но firstList отсортирован неправильно. По большей части он отсортирован правильно, но некоторые элементы не в порядке. Например, firstList будет выглядеть примерно так:

AAA 
BBB 
CCC 
DDD 
NNN <--- wrong order 
EEE 
FFF 
GGG 
PPP <--- wrong order 
HHH 
III 

Однако secondList сортируется полностью правильно.

Я изучил запрос, который создает LINQ, и запрос имеет правильный ORDER BY. Я выполнил этот же запрос в SQL Management Studio, и результаты упорядочены правильно (в том же порядке, что и второйList, но не firstList). Я пробовал делать это с помощью orderby в моем запросе LINQ, а не с помощью OrderBy(), и результаты неверны одинаково.

Я не понимаю, что здесь происходит. Не следует ли сортировать firstList и не должен быть firstList и secondList одинаковыми?

Я использую Fluent API для сопоставления своих объектов с таблицами и свойствами с полями, если это имеет значение.

+0

Я не вижу ничего плохого в том, что у вас есть. firstList должен быть отсортирован и должен быть таким же, как у secondList. Единственное отличие состоит в том, что первая будет сортироваться по db, а вторая будет сортироваться по .NET. Является ли ваш пример данными на самом деле, что сортируется, или это что-то еще, когда коалиция в базе данных не то, что вы ожидаете? (Сортировка u и u с умлаутами одинаковые и т. Д.)? –

+0

Это не мой точный производственный код, но сортировка не должна быть проблемой при сортировке. Реальные данные имеют 1000 значений, из которых 50 значений. Что происходит, так это то, что порядок сортировки похож на A, A, A, A, B, B, B, B, A, B, B, B, C, C, A, C, C, D .... –

+0

Это трудно воспроизвести, поэтому попробуйте разные варианты. Вы все еще видите несортированный список, если вы создаете первый список, например, 'firstList = context.myObjects.OrderBy (p => p.FirstField).ToList(); '? – ziddarth

ответ

0

В вашем примере firstList выполнял заказы из базы данных, второй список выполнял упорядочение с объекта в памяти. (оба списка должны давать вам одинаковые результаты, однако они выполняют порядок, отличный от базы данных, другой сортировки в памяти, поэтому возможно, что причиной может быть плохой индекс)

если вы попробуете следующий код: порядок, который мы будем делать в памяти как для firstList, так и для второгоList, и они будут иметь те же результаты.

Я добавил второй .ToList() в ваш синтаксис firstList, это приведет к тому, что данные будут восстановлены, а затем упорядочены. скорее, создание предложения orderby в вашем sql-коде.

List<MyClass> firstList = (from p in context.myObjects select p).ToList().OrderBy (p=>p.FirstField).ToList(); 


List<MyClass> secondList = firstList.OrderBy(p => p.FirstField).ToList(); 
1

Я вижу, в чем проблема. Спасибо всем за ваши предложения; это заставило меня смотреть в нужное место. Проблема в том, что таблица имеет составной ключ, который состоит из FirstField, SecondField и ThirdField. Когда я настраивал свой контекст с Fluent API, я копировал какой-то код из другого места в своем Контексте, и я случайно установил первичный ключ таблицы в FirstField. Это привело к тому, что Entity Framework присвоила одинаковые значения SecondField и ThirdField каждому отдельному значению FirstField. Например, если строки в базе данных были {A, BB, CCC}, {A, EE, FFF}, {A, HH, III}, Entity Framework давали мне {A, BB, CCC}, {A, BB, CCC}, {A, BB, CCC}. Я исправил свой HasKey(), и теперь все работает.