2012-01-11 14 views
5

Tengo una lista de clientes que se pueden ordenar en cualquier lugar de 1 a 6 campos en función de la selección de un usuario. Los campos de clasificación pueden estar en cualquier orden. Si conozco a los campos y la secuencia antes de tiempo, la clasificación es fácil:¿Cómo puedo ordenar una lista basada en las selecciones de un usuario en ASP.NET MVC?

customers = customers 
       .OrderBy(c => c.LastName) 
       .ThenBy(c => c.City) 
       .ThenBy(c => c.Age).ToList(); 

¿Cómo iba a pasar en los campos de clasificación en tiempo de ejecución? ¿Hay alguna manera de hacer algo como esto?

string sortField1 = "State"; 
    string sortField2 = "City"; 
    string sortField3 = "Type"; 

    customers = customers 
       .OrderBy(c => c.sortField1) 
       .ThenBy(c => c.sortField2) 
       .ThenBy(c => c.sortField3).ToList(); 

Respuesta

1

Resolví esto encadenando sentencias .OrderBy en un ciclo ForEach. Se agrega un .OrderBy a mi consulta de Linq para cada criterio de clasificación seleccionado por el usuario. Al incluir mi lista en un IQueryable, puedo ver la consulta de Linq a medida que se construye.

IQueryable<CustomerMaster> query = customers.AsQueryable(); 

      // reverse the sort order (sorts are applied incrementally) 
      // We need the user's last 
      // sort criteria to get applied first 
      sortOrder.Reverse(); 

      foreach (var sortItem in sortOrder) 
      { 
       switch (sortItem) 
       { 
        case "LName": 
         query = query.OrderBy(c => c.LName); 
         break; 

        case "State": 
         query = query.OrderBy(c => c.State); 
         break; 

        default: 
         query = query 
          .OrderBy(c => c.LName) 
          .ThenBy(c => c.State); 
         break; 
       } 
      } 
      customers = query.ToList(); 
      // set the sortorder back to user's order 
      sortOrder.Reverse(); 
     } 

consulta resultante:

query = {System.Collections.Generic 
     .List`1[CustomerMaster] 
     .OrderBy(c => c.LName) 
     .OrderBy(c => c.State)} 
1

Tenga una mirada en http://tomasp.net/articles/dynamic-linq-queries.aspx para un tutorial sobre cómo construir consultas dinámicas LinQ en tiempo de ejecución. Esto debería ser lo que estás buscando.

+0

Gracias, Chrisi. Le daré un vistazo. –

+2

Leí la publicación de Tomás. También miré [la publicación de Scott Guthrie] (http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library. aspx) (desde 2008) en linq dinámico. No me gustó que ambos caminos parezcan muertos. Tomás tiene un enlace a un proyecto CodePlex suyo que estaba en alfa en 2007 y no ha sido tocado desde entonces. Afortunadamente, la solución de encadenar un número variable de .OrderBy me funciona. –

Cuestiones relacionadas