У меня есть две таблицы, movies
и categories
, и я получаю упорядоченный список сначала по categoryID, а затем по имени .
Таблица фильмов имеет три столбца ID, Имя и CategoryID . Таблица категорий имеет два столбца ID и Имя .
Я попробовал что-то вроде следующего, но это не сработало.
var movies = _db.Movies.OrderBy( m => { m.CategoryID, m.Name })
linq
sql-order-by
Саша
источник
источник
Ответы:
Это должно работать для вас:
источник
Var movies = _db.Movies.Orderby(c => c.Category).ThenBy(n => n.Name)
чтобы использоватьVar movies = _db.Movies.Orderby(c => c.Category).OrderBy(n => n.Name)
2 раза "orderBy", почему результат отличается?ThenBy
?! ( Изменить: похоже, что он был введен в .NET 4.0, который объясняет, как он незаметно проскользнул мимо меня.)Используя не лямбда, синтаксис запроса LINQ, вы можете сделать это:
[РЕДАКТИРОВАТЬ к адресу комментария] Чтобы управлять порядком сортировки, используйте ключевые слова
ascending
(которые используются по умолчанию и поэтому не особенно полезны) илиdescending
, например, так:источник
_db.Movies.Orderby(c => c.Category).OrderBy(n => n.Name)
. Более правильным являетсяfrom row in _db.Movies orderby row.Category descending orderby row.Name select row
_db.Movies.Orderby(c => c.Category).OrderBy(n => n.Name)
. Два предоставленных вами фрагмента эквивалентны друг другу, а не ОП.Добавить новое":
Это работает на моей коробке. Он возвращает что-то, что можно использовать для сортировки. Возвращает объект с двумя значениями.
Аналогично, но отличается от сортировки по объединенному столбцу следующим образом.
источник
.OrderBy( m => new { m.CategoryID, m.Name })
и.OrderBy( m => new { m.Name, m.CategoryID })
получу те же результаты, чем при уважении предполагаемого приоритета. Иногда может показаться, что вы заказываете, что вам нужно, просто по стечению обстоятельств. Кроме того,m.CategoryID.ToString() + m.Name
будут произведены неправильные заказы, если CategoryID являетсяint
. Например, что-то с id = 123, name = 5times появится после id = 1234, name = что-то вместо прежнего. Также неэффективно проводить сравнения строк, где могут происходить сравнения int.используйте следующую строку в вашем DataContext, чтобы записать действие SQL в DataContext на консоль - тогда вы сможете точно увидеть, что ваши операторы linq запрашивают из базы данных:
Следующие операторы LINQ:
А ТАКЖЕ
создайте следующий SQL:
Принимая во внимание, что повторение OrderBy в Linq, по-видимому, обращает результирующий вывод SQL:
А ТАКЖЕ
создайте следующий SQL (Name и CategoryId переключаются):
источник
Я создал несколько методов расширения (ниже), поэтому вам не нужно беспокоиться, заказан ли IQueryable или нет. Если вы хотите упорядочить по нескольким свойствам, просто сделайте это следующим образом:
Это особенно полезно, если вы создаете порядок динамически, например, из списка свойств для сортировки.
источник
nullable datetime
Есть по крайней мере еще один способ сделать это с помощью LINQ, хотя и не самый простой. Вы можете сделать это с помощью
OrberBy()
метода, который используетIComparer
. Сначала вам нужно реализоватьIComparer
дляMovie
класса:Тогда вы можете заказать фильмы со следующим синтаксисом:
Если вам нужно переключить порядок по убыванию для одного из элементов, просто переключите x и y внутри
Compare()
методаMovieComparer
соответственно.источник
MovieComparer
самостоятельно; вместо этого вы можете сделать_db.Movies.OrderBy(item => item, Comparer<Movie>.Create((x, y) => { if (x.CategoryId == y.CategoryId) { return x.Name.CompareTo(y.Name); } else { return x.CategoryId.CompareTo(y.CategoryId); } }));
. Конечно, если вы предпочитаете писать логику в виде одного выражения вместоif
...else
, тогда лямда(x, y) => expr
может быть проще.Если использовать общий репозиторий
еще
источник