Tengo dos tablas movies
y primero categories
obtengo una lista ordenada por Id. De categoría y luego por Nombre .
La tabla de películas tiene tres columnas ID, Name y CategoryID . La tabla de categorías tiene dos columnas ID y Nombre .
Intenté algo como lo siguiente, pero no funcionó.
var movies = _db.Movies.OrderBy( m => { m.CategoryID, m.Name })
linq
sql-order-by
Sasha
fuente
fuente
Respuestas:
Esto debería funcionar para usted:
fuente
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 veces "orderBy", ¿por qué el resultado es diferente?ThenBy
? ( Editar: parece que se introdujo en .NET 4.0, lo que explica cómo pasó desapercibido).Usando LINQ sintaxis de consulta-sintaxis, puede hacer esto:
[EDITAR para abordar el comentario] Para controlar el orden de clasificación, use las palabras clave
ascending
(que es la predeterminada y, por lo tanto, no es particularmente útil) odescending
, de esta manera:fuente
_db.Movies.Orderby(c => c.Category).OrderBy(n => n.Name)
. Más correcto esfrom row in _db.Movies orderby row.Category descending orderby row.Name select row
_db.Movies.Orderby(c => c.Category).OrderBy(n => n.Name)
. Los dos fragmentos que proporciona son equivalentes entre sí, no a los OP.Añadir "nuevo":
Eso funciona en mi caja. Devuelve algo que se puede usar para ordenar. Devuelve un objeto con dos valores.
Similar, pero diferente a ordenar por una columna combinada, como sigue.
fuente
.OrderBy( m => new { m.CategoryID, m.Name })
y.OrderBy( m => new { m.Name, m.CategoryID })
produciré los mismos resultados en lugar de respetar la prioridad prevista. A veces parecerá que le da el orden que desea simplemente por coincidencia. Ademásm.CategoryID.ToString() + m.Name
producirá pedidos incorrectos si CategoryID es unint
. Por ejemplo, algo con id = 123, name = 5times aparecerá después de id = 1234, name = something en lugar de antes. Tampoco es ineficiente hacer comparaciones de cadenas donde podrían ocurrir comparaciones int.use la siguiente línea en su DataContext para registrar la actividad de SQL en el DataContext en la consola; luego podrá ver exactamente lo que sus declaraciones linq solicitan de la base de datos:
Las siguientes declaraciones de LINQ:
Y
producir el siguiente SQL:
Mientras que, al repetir un OrderBy en Linq, parece revertir la salida SQL resultante:
Y
producir el siguiente SQL (se cambian Name y CategoryId):
fuente
He creado algunos métodos de extensión (a continuación) para que no tenga que preocuparse si un IQueryable ya está ordenado o no. Si desea ordenar por múltiples propiedades, simplemente hágalo de la siguiente manera:
Esto es especialmente útil si crea el orden dinámicamente, por ejemplo, desde una lista de propiedades para ordenar.
fuente
nullable datetime
Hay al menos una forma más de hacer esto usando LINQ, aunque no es la más fácil. Puede hacerlo usando el
OrberBy()
método que usa unIComparer
. Primero debe implementar unIComparer
para laMovie
clase como este:Luego puede ordenar las películas con la siguiente sintaxis:
Si necesita cambiar el orden a descendente para uno de los elementos, simplemente cambie las x e y dentro del
Compare()
métodoMovieComparer
correspondiente.fuente
MovieComparer
usted mismo; en cambio puedes hacer_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); } }));
. Por supuesto, si prefiere escribir la lógica como una expresión, en lugar deif
...else
, entonces lamda(x, y) => expr
puede ser más simple.Si usa repositorio genérico
más
fuente