2015-01-15 2 views
3

Я использую EF Code First, и у меня есть Linq To SQL (против базы данных Oracle). Ради простоты я буду возобновлять сценарий. Предположим, у меня есть таблица продуктов, как это:Метод IQueryable.ToList, испорченный с порядком сортировки T-SQL

ProductName (varchar) 
A 
1 
C 
2 
B 
3 
4 

Ну, так что я построить запрос с использованием EF:

var query = Repo.Products.AsQueryable().OrderBy(p => p.ProductName); 

Когда я отладки, я получаю сгенерированный T-SQL и выполнить в оракула, Everthing является оК, набор результатов:

1 
2 
3 
4 
A 
B 
C 

Это правильно (помните, поле VARCHAR/строка), учитывая порядок старшинства символов.

Хорошо, теперь, если я делаю следующее:

var list = query.ToList(); 

Результат является:

A 
B 
C 
1 
2 
3 
4 

Это неправильно, и отличается от Oracle результирующего набора. Если я вызываю ToList() до OrderBy(), результат упорядочен правильно, но я не хочу вызывать ToList() раньше, чтобы избежать выборки всех записей перед фильтрацией.

Я действительно с ума схожу с этим. Кто-нибудь может помочь?

+0

Нет ли здесь ничего другого? Я не могу воспроизвести это на моем конце. – IronMan84

+0

Ничего другого, каждый запрос linq к базе данных oracle размещает буквы перед числами с помощью orderby, даже если T-SQL сгенерирован правильно и проверен, упорядочивая отлично. Уже злитесь. –

+0

Кажется, проблема прямо внутри ToList, при получении результатов и преобразовании их в Список объектов. Есть ли способ отладки метода ToList? –

ответ

0

Я понял!

Проблема была в переменной NLS_SORT в Oracle. Странным было то, что PL/SQL Manager Developer показывает «правильный» порядок с номерами сначала, но причина для другого поведения заключается в том, что он изменяет сеанс переменной NLS_SORT, а Entity Framework - нет.

Я просто установил NLS_SORT в «BINARY» перед выполнением любого запроса, и это все!

Решенный!

Спасибо.