c# - IQueryable orden por dos o más propiedades
linq sorting (3)
Actualmente estoy ordenando una lista de objetos personalizados utilizando el método OrderBy de IQueryable de la siguiente manera:
mylist.AsQueryable().OrderBy("PropertyName");
Ahora estoy buscando ordenar por más de una propiedad. ¿Hay alguna forma de hacer eso?
Gracias yannis
Podrías usar. .ThenBy
:
var result = mylist
.AsQueryable()
.OrderBy(x => x.PropertyName)
.ThenBy(x => x.SomeOtherProperty);
Probablemente quieras usar el método de extensión ThenBy para poder ordenar por múltiples campos
return myList.AsQueryable().OrderBy(m=>m.Property1).ThenBy(m => m.Property2);
Si quieres Linq dinámico, mira LinqKit . Recientemente implementé la biblioteca Linq dinámica de Microsoft desde here y pude clasificar por dos campos usando una cadena.
¡Cosas geniales! No estoy seguro si esto será en .NET 5 o no.
OrderBy(i => i.PropertyName).ThenBy(i => i.AnotherProperty)
En OrderBy y ThenBy tienes que proporcionar la función keySelector, que elige la clave para ordenar desde el objeto. Entonces, si conoce el nombre de la propiedad solo en el tiempo de ejecución, puede realizar dicha función con Reflexión como:
var propertyInfo = i.GetType().GetProperty("PropertyName");
var sortedList = myList.OrderBy(i => propertyInfo.GetValue(i, null))
Pero será más lento, luego el acceso directo a la propiedad. También puede "compilar" dicha función sobre la marcha con Linq.Expressions y funcionará más rápido que la reflexión, pero no es muy fácil. O puede usar CollectionViewSource y sus capacidades de clasificación en WPF.
Y no olvide que OrderBy () devuelve ordenados enumerables y no ordena su lista existente en el lugar. En su ejemplo, no guardó la lista ordenada en la variable.