Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LINQ (Language-Integrated Query) > Queryable.OrderBy() по нескольким полям


Автор: Лен 17.7.2009, 16:07
Пусть есть некий класс 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] - почему сортировка идёт только по одному полю? (аналогичная ситуация у меня была и при сортировке по трём полям)

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

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

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

Автор: Лен 20.7.2009, 12:12
Спасибо, очень помогло. Только один нюанс:
при вызове ThenBy() queryable (типа IQueryable<T>) надо приводить к IOrderedQueryable<T>.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)