Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Queryable.OrderBy() по нескольким полям, Как правильно отсортировать записи? 
V
    Опции темы
Лен
Дата 17.7.2009, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 20.1.2009

Репутация: нет
Всего: нет



Пусть есть некий класс MwfDocument с кучей полей. Пусть есть некий IQueryable<MwfDocument>. Нужно отсортировать его по нескольким полям. В результате некоторых умственных измышлений пришёл к такому варианту:
Код

queryable = queryable.OrderBy(doc => doc.SortField1).OrderBy(doc => doc.SortField2). // и так далее...


В итоге получился запрос, который я не могу привести по техническим причинам, но его Expression.ToString() выглядит так:
value(System.Data.Objects.ObjectQuery`1[BlankPublish.Entity.WorkflowDocument]).Where(doc => (Convert(doc.RawStatus) = 10)).Where(doc => ((Convert(doc.SubjectOwner.SubjectID) = null) || (doc.SubjectOwner.SubjectID = value(BlankPublish.Entity.Filters.SearchFilterDocuments).SubjectOwnerID))).OrderBy(x => x.DocumentDate).OrderBy(x => x.DocumentNumber)
SQL Profiler показывает, что EntityFramework, через который идёт работа, отправляет на сервер такой запрос:
Код

exec sp_executesql N'SELECT TOP (100) 
[Project1].[C1] AS [C1], 
[Project1].[ID] AS [ID], 
[Project1].[Label] AS [Label], 
[Project1].[Status] AS [Status], 
...
<skip>
...
)  AS [Project1]
ORDER BY [Project1].[DocumentNumber] ASC',N'@p__linq__83 bigint',@p__linq__83=8

ORDER BY [Project1].[DocumentNumber] - почему сортировка идёт только по одному полю? (аналогичная ситуация у меня была и при сортировке по трём полям)

Что и как сделать, чтобы правильно отсортировать по нескольким полям?

Это сообщение отредактировал(а) Лен - 17.7.2009, 16:12
PM MAIL   Вверх
WarHog
Дата 17.7.2009, 17:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 20.10.2007
Где: Воронеж

Репутация: 1
Всего: 2



Привет, в случае нескольких ключей, по которым должна идти сортировка, нужно воспользоваться сначала OrderBy, а затем ThenBy, примерно так:
Код

queryable.OrderBy(doc => doc.SortField1).ThenBy(doc => doc.SortField2)

--------------------
PM MAIL   Вверх
Лен
Дата 20.7.2009, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 20.1.2009

Репутация: нет
Всего: нет



Спасибо, очень помогло. Только один нюанс:
при вызове ThenBy() queryable (типа IQueryable<T>) надо приводить к IOrderedQueryable<T>.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LINQ (Language-Integrated Query) | Следующая тема »


 




[ Время генерации скрипта: 0.0544 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.