¿Cómo especifico el argumento pasado para orderby
usar un valor que tomo como parámetro?
Ex:
List<Student> existingStudends = new List<Student>{ new Student {...}, new Student {...}}
Implementación actual:
List<Student> orderbyAddress = existingStudends.OrderBy(c => c.Address).ToList();
En lugar de c.Address
, ¿cómo puedo tomar eso como parámetro?
Ejemplo
string param = "City";
List<Student> orderbyAddress = existingStudends.OrderByDescending(c => param).ToList();
OrderBy
es una función de Linq y está activadaIEnumerable
, no una función específica deList
. Siéntase libre de revertir la edición o cambiarla más :)Respuestas:
Aquí hay una posibilidad usando la reflexión ...
fuente
ThenBy
método .Puede usar un poco de reflexión para construir el árbol de expresión de la siguiente manera (este es un método de extensión):
orderByProperty
es el nombre de propiedad por el que desea ordenar y, si pasa verdadero como parámetrodesc
, se ordenará en orden descendente; de lo contrario, se ordenará en orden ascendente.Ahora deberías poder hacer
existingStudents.OrderBy("City",true);
oexistingStudents.OrderBy("City",false);
fuente
Para ampliar la respuesta de @Icarus : si desea que el tipo de retorno del método de extensión sea un IOrderedQueryable en lugar de un IQueryable, simplemente puede emitir el resultado de la siguiente manera:
fuente
1) Instalar System.Linq.Dynamic
2) Agrega el siguiente código
3) Escriba su interruptor para seleccionar la función Lambda
4) Usa tus ayudantes
5) Puede usarlo con paginación ( PagedList )
Explicación
System.Linq.Dynamic nos permite establecer un valor de cadena en el método OrderBy. Pero dentro de esta extensión, la cadena se analizará en Lambda. Así que pensé que funcionaría si analizamos Lambda en una cadena y se la damos al método OrderBy. ¡Y funciona!
fuente
fuente
Aquí hay algo que se me ocurrió para lidiar con un Descendente condicional. Puede combinar esto con otros métodos para generar la
keySelector
función de forma dinámica.Uso:
Tenga en cuenta que esto le permite encadenar esta
.OrderBy
extensión con un nuevo parámetro en cualquier IQueryable.fuente
Esto no le permite aprobar una
string
, como pidió en su pregunta, pero aún podría funcionar para usted.El
OrderByDescending
método toma aFunc<TSource, TKey>
, por lo que puede reescribir su función de esta manera:También hay otras sobrecargas
OrderByDescending
que toman aExpression<Func<TSource, TKey>>
, y / o aIComparer<TKey>
. También puede mirarlos y ver si le proporcionan algo de utilidad.fuente
La única solución que funcionó para mí fue publicada aquí https://gist.github.com/neoGeneva/1878868 por neoGeneva.
¡Volveré a publicar su código porque funciona bien y no me gustaría que se perdiera en las redes!
fuente
Agregue el paquete de pepitas Dynamite a su código
Agregue el espacio de nombres Dynamite.Extensions Ej .: usando Dynamite.Extensions;
Dar Orden por consulta como cualquier consulta SQL Ej .: estudiantes.OrderBy ("Ciudad DESC, Dirección"). ToList ();
fuente
Para extender la respuesta de @Icarus: si desea ordenar por dos campos, podría realizar la siguiente función (para un campo, la respuesta de Icarius funciona muy bien).
Esta es la función que devuelve el cuerpo para la expresión lambda, funciona con string e int, pero basta con agregar más tipos para que funcione según la necesidad de cada programador
para usarlo se hace lo siguiente
si hay una mejor manera de hacer esto, sería genial si lo compartieran
Logré resolverlo gracias a: ¿Cómo puedo hacer una expresión lambda de propiedad múltiple con Linq?
fuente
Llego muy tarde a la fiesta, pero ninguna de estas soluciones funcionó para mí. Estaba ansioso por probar System.Linq.Dynamic, pero no pude encontrar eso en Nuget, ¿tal vez depreciado? De cualquier manera...
Aquí hay una solución que se me ocurrió. Necesitaba usar dinámicamente una combinación de OrderBy , OrderByDescending y OrderBy> ThenBy .
Simplemente creé un método de extensión para mi objeto de lista, un poco hacky, lo sé ... No recomendaría esto si fuera algo que estuviera haciendo mucho, pero es bueno para una sola vez.
fuente