Tenho duas tabelas movies
e categories
recebo uma lista ordenada por categoryID primeiro e depois por Name .
A tabela de filmes possui três IDs de colunas , Nome e ID da categoria . A tabela de categorias possui duas colunas ID e Nome .
Tentei algo como o seguinte, mas não funcionou.
var movies = _db.Movies.OrderBy( m => { m.CategoryID, m.Name })
linq
sql-order-by
Sasha
fonte
fonte
Respostas:
Isso deve funcionar para você:
fonte
Var movies = _db.Movies.Orderby(c => c.Category).ThenBy(n => n.Name)
usarVar movies = _db.Movies.Orderby(c => c.Category).OrderBy(n => n.Name)
2 vezes "orderBy", por que o resultado é diferente?ThenBy
?! ( Edit: parece que foi introduzido no .NET 4.0, que explica como ele passou por mim despercebido.)Usando LINQ não-lambda, sintaxe de consulta, você pode fazer isso:
[EDITAR para endereçar o comentário] Para controlar a ordem de classificação, use as palavras-chave
ascending
(que é o padrão e, portanto, não são particularmente úteis) oudescending
, assim:fonte
_db.Movies.Orderby(c => c.Category).OrderBy(n => n.Name)
. O mais correto éfrom row in _db.Movies orderby row.Category descending orderby row.Name select row
_db.Movies.Orderby(c => c.Category).OrderBy(n => n.Name)
. Os dois trechos que você fornece são equivalentes entre si, não aos OP.Adicionar novo":
Isso funciona na minha caixa. Ele retorna algo que pode ser usado para classificar. Retorna um objeto com dois valores.
Semelhante, mas diferente da classificação por uma coluna combinada, a seguir.
fonte
.OrderBy( m => new { m.CategoryID, m.Name })
e.OrderBy( m => new { m.Name, m.CategoryID })
produzirá os mesmos resultados, em vez de respeitar a prioridade pretendida. Às vezes, parece que você recebe a ordem que deseja puramente por coincidência. Além dissom.CategoryID.ToString() + m.Name
, produzirá pedidos incorretos se o CategoryID for umint
. Por exemplo, algo com id = 123, nome = 5 vezes, aparecerá após id = 1234, nome = algo em vez de antes. Também não é ineficiente fazer comparações de strings nas quais comparações int possam ocorrer.use a seguinte linha em seu DataContext para registrar a atividade SQL no DataContext no console - para poder ver exatamente o que suas instruções linq estão solicitando no banco de dados:
As seguintes instruções LINQ:
E
produza o seguinte SQL:
Considerando que, repetir um OrderBy no Linq, parece inverter a saída SQL resultante:
E
produza o seguinte SQL (Name e CategoryId são alternados):
fonte
Eu criei alguns métodos de extensão (abaixo) para que você não precise se preocupar se um IQueryable já está encomendado ou não. Se você deseja solicitar por várias propriedades, faça o seguinte:
Isso é especialmente útil se você criar a ordem dinamicamente, fe a partir de uma lista de propriedades para classificar.
fonte
nullable datetime
Há pelo menos mais uma maneira de fazer isso usando o LINQ, embora não seja o mais fácil. Você pode fazer isso usando o
OrberBy()
método que usa umIComparer
. Primeiro você precisa implementar umIComparer
para aMovie
classe como este:Depois, você pode solicitar os filmes com a seguinte sintaxe:
Se você precisar alterar a ordem para decrescente para um dos itens, basta alternar x e y dentro do
Compare()
método correspondenteMovieComparer
.fonte
MovieComparer
; em vez disso você pode fazer_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); } }));
. Obviamente, se você preferir escrever a lógica como uma expressão, em vez deif
...else
, o lamda(x, y) => expr
pode ser mais simples.Se usar repositório genérico
outro
fonte