2012-05-22 14 views
14

Duplicar posible:
Dynamic LINQ OrderBycaso interruptor Evitar -linq

switch (sort) { 
       case "Title": 
        queryResults = queryResults.OrderBy(r => r.Title); 
        break; 
       default: 
        queryResults = queryResults.OrderBy(r => r.LastName); 
        break; 

¿Hay alguna manera de deshacerse del bloque de interruptores de arriba?

¿Puedo hacer algo como:

queryResults = queryResults.OrderBy(r => r."sort"); 
or 
queryResults = queryResults.OrderBy(r => r.sort); 
+0

Usted encontrará su respuesta en esta pregunta: ¿http://stackoverflow.com/questions/41244/dynamic-linq -orderby –

+0

Las soluciones proporcionadas no funcionarán para la mayoría de los proveedores de linq, consulte mi solución: http://stackoverflow.com/a/21936366/775114 –

Respuesta

8

Si quería hacer esto completamente dinámico, que podría utilizar un poco de reflexión (ejemplo sencillo):

string prop = "Title"; 
var q = queryResults.OrderBy(x => x.GetType().GetProperty(prop).GetValue(x, null)); 

No consideraría este la mejor solución en cualquier caso, sin embargo. Si esto realmente tiene sentido para usted depende de dónde obtiene el nombre de la propiedad (si lo obtiene también de la reflexión, o no) y cuántas propiedades hay.

5

Esto debe hacerlo

queryResults = queryResults.OrderBy(r => sort == "Title" ? r.Title : r.LastName) 
4

Usted podría utilizar DynamcLinq. No lo he tocado en más de un año, pero obtuve los resultados esperados. Su código cambiaría a:

queryResults = queryResults.OrderBy(sort);

Oh fresco, que también es una NuGet package too

Cuestiones relacionadas