2012-01-11 9 views
5

Ho un elenco di clienti che possono essere ordinati ovunque da 1 a 6 campi in base alla selezione dell'utente. I campi di ordinamento possono essere in qualsiasi ordine. Se conosco i campi e la sequenza prima del tempo, l'ordinamento è facile:Come posso ordinare un elenco in base alle selezioni di un utente in ASP.NET MVC?

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

Come faccio a passare nei campi di ordinamento in fase di esecuzione? C'è un modo per fare qualcosa del genere?

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

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

risposta

1

Ho risolto questo concatenando le istruzioni .OrderBy in un ciclo ForEach. An .OrderBy viene aggiunto alla mia query Linq per ogni criterio di ordinamento selezionato dall'utente. Racchiudendo la mia lista in un IQueryable, sono in grado di vedere la query di Linq così come è stata creata.

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(); 
     } 

query risultante:

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

Dai un'occhiata alla http://tomasp.net/articles/dynamic-linq-queries.aspx per un tutorial su come creare query dinamica LinQ in fase di esecuzione. Questo dovrebbe essere quello che stai cercando.

+0

Grazie, Chrisi. Darò un'occhiata. –

+2

Ho letto il post di Tomas. Ho anche guardato [il post di Scott Guthrie] (http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library. aspx) (dal 2008) su linq dinamico. Non mi piaceva che entrambi quei sentieri sembrassero morti. Tomas ha un link a un suo progetto CodePlex che era in alpha nel 2007 e da allora non è stato toccato. Fortunatamente la soluzione di concatenare un numero variabile di opere di .OrderBy per me. –

Problemi correlati