Encontré un ejemplo en VS2008 Ejemplos para Dynamic LINQ que le permite usar una cadena tipo sql (por ejemplo, OrderBy("Name, Age DESC"))
para ordenar. Desafortunadamente, el método incluido solo funciona IQueryable<T>
. ¿Hay alguna forma de activar esta funcionalidad IEnumerable<T>
?
c#
linq
linq-to-objects
John Sheehan
fuente
fuente
Respuestas:
Me topé con este viejo ...
Para hacer esto sin la biblioteca LINQ dinámica, solo necesita el código de la siguiente manera. Esto cubre los escenarios más comunes, incluidas las propiedades anidadas.
Para que funcione
IEnumerable<T>
, puede agregar algunos métodos de envoltura que funcionanAsQueryable
, pero el código a continuación es laExpression
lógica central necesaria.Editar: se vuelve más divertido si desea mezclar eso
dynamic
, aunque tenga en cuenta quedynamic
solo se aplica a LINQ-to-Objects (los árboles de expresión para ORM, etc., en realidad no pueden representardynamic
consultas,MemberExpression
no lo admiten). Pero aquí hay una manera de hacerlo con LINQ-to-Objects. Tenga en cuenta que la elección deHashtable
se debe a una semántica de bloqueo favorable:fuente
IQueryable<T>
, así que si tienes algo comoList<T>
(que esIEnumerable<T>
), es posible que necesites usarAsQueryable()
, por ejemplovar sorted = someList.AsQueryable().OrderBy("Foo.Bar");
Demasiado fácil sin ninguna complicación:
using System.Linq.Dynamic;
en la parte superior.vehicles = vehicles.AsQueryable().OrderBy("Make ASC, Year DESC").ToList();
fuente
System.Linq.Dynamic
de?Encontré la respuesta. Puedo usar el
.AsQueryable<>()
método de extensión para convertir mi lista a IQueryable, luego ejecutar el orden dinámico en contra.fuente
Acabo de tropezar con esta pregunta.
Usando la implementación ApplyOrder de Marc desde arriba, combiné un método de Extensión que maneja cadenas similares a SQL como:
Los detalles se pueden encontrar aquí: http://aonnull.blogspot.com/2010/08/dynamic-sql-like-linq-orderby-extension.html
fuente
Supongo que funcionaría usar la reflexión para obtener cualquier propiedad que desee ordenar:
Tenga en cuenta que el uso de la reflexión es considerablemente más lento que el acceso directo a la propiedad, por lo que el rendimiento debería investigarse.
fuente
Basándome en lo que otros han dicho. Descubrí que lo siguiente funciona bastante bien.
fuente
He tropezado con esta pregunta buscando cláusulas de pedido múltiple de Linq y tal vez esto era lo que el autor estaba buscando
Aquí se explica cómo hacerlo:
fuente
Estaba tratando de hacer esto, pero tengo problemas con la solución de Kjetil Watnedal porque no uso la sintaxis linq en línea; prefiero la sintaxis de estilo de método. Mi problema específico fue tratar de hacer una ordenación dinámica usando una costumbre
IComparer
.Mi solución terminó así:
Dada una consulta IQueryable como esta:
Y dado un argumento de campo de ordenación en tiempo de ejecución:
La dinámica OrderBy se ve así:
Y eso está usando un pequeño método auxiliar llamado GetReflectedPropertyValue ():
Una última cosa, mencioné que quería
OrderBy
usar el personalizadoIComparer
, porque quería hacer la clasificación natural .Para hacer eso, simplemente modifico el
OrderBy
para:Ver esta publicación para el código de
NaturalSortComparer()
.fuente
Usar dinámico
linq
solo agrega
using System.Linq.Dynamic;
Y úsalo así para ordenar todas tus columnas:
fuente
Puedes agregarlo:
La
GetPropertyValue
función es de la respuesta de Kjetil Watnedal.El problema sería por qué? Cualquiera de estos tipos arrojaría excepciones en tiempo de ejecución, en lugar de tiempo de compilación (como la respuesta de D2VIANT).
Si se trata de Linq a Sql y el orden es un árbol de expresión, de todos modos se convertirá en SQL para su ejecución.
fuente
OrderBy
¡no mantengas el orden anterior!Aquí hay algo más que encontré interesante. Si su fuente es una DataTable, puede usar la ordenación dinámica sin usar Dynamic Linq
referencia: http://msdn.microsoft.com/en-us/library/bb669083.aspx (Uso de DataSetExtensions)
Aquí hay una forma más de hacerlo convirtiéndolo en un DataView:
fuente
Gracias a Maarten ( Consulta una colección usando el objeto PropertyInfo en LINQ ) obtuve esta solución:
En mi caso, estaba trabajando en un "ColumnHeaderMouseClick" (WindowsForm), así que encontré la columna específica presionada y su correspondiente PropertyInfo:
O
(asegúrese de que sus nombres de columna coincidan con las propiedades del objeto)
Salud
fuente
Después de mucho buscar esto funcionó para mí:
fuente
Puede convertir el IEnumerable a IQueryable.
fuente
Una solución alternativa utiliza la siguiente clase / interfaz. No es realmente dinámico, pero funciona.
fuente
Esta respuesta es una respuesta a los comentarios que necesitan un ejemplo para la solución provista por @John Sheehan - Runscope
en DAL (capa de acceso a datos),
La versión IEnumerable:
La versión IQueryable
Ahora puede usar la versión IQueryable para enlazar, por ejemplo GridView en Asp.net y beneficiarse de la clasificación (no puede ordenar usando la versión IEnumerable)
Utilicé Dapper como ORM y construí la versión IQueryable y utilicé la clasificación en GridView en asp.net de manera muy fácil.
fuente
Primero instale las herramientas dinámicas -> NuGet Package Manager -> Package Manager Console
Agregar espacio de nombres
using System.Linq.Dynamic;
Ahora puedes usar
OrderBy("Name, Age DESC")
fuente
Puedes usar esto:
fuente
Convierta la Lista a IEnumerable o Iquerable, agregue usando el espacio de nombres System.LINQ.Dynamics, luego puede mencionar los nombres de propiedad en una cadena separada por comas al Método OrderBy que viene por defecto de System.LINQ.Dynamic.
fuente
fuente