2012-05-11 13 views
6

Sto controllando il parametro ordinamento e la costruzione di una serie di if dichiarazioni:Come posso migliorare questo codice di classificazione?

if (sortDirection == "ASC") 
{ 
    if (sortBy == "Id") 
     return customerList.OrderBy(x => x.Id).Skip(startIndex).Take(pageSize).ToList(); 
    if (sortBy == "FirstName") 
     return customerList.OrderBy(x => x.FirstName).Skip(startIndex).Take(pageSize).ToList(); 
    if (sortBy == "City") 
     return customerList.OrderBy(x => x.City).Skip(startIndex).Take(pageSize).ToList(); 
} 
else 
{ 
    if (sortBy == "Id") 
     return customerList.OrderByDescending(x => x.Id).Skip(startIndex).Take(pageSize).ToList(); 
    if (sortBy == "FirstName") 
     return customerList.OrderByDescending(x => x.FirstName).Skip(startIndex).Take(pageSize).ToList(); 
    if (sortBy == "City") 
     return customerList.OrderByDescending(x => x.City).Skip(startIndex).Take(pageSize).ToList(); 
} 

Come faccio questo meglio?

+6

Definire "migliore". Meglio per cosa? – Oded

+1

In che modo vuoi "migliorarlo"? Non funziona come previsto? È troppo lento? Non ti piace come è strutturato il codice? Abbiamo bisogno di maggiori informazioni qui. –

+0

Vorrei raccomandare l'uso della composizione LINQ. Vedi http://stackoverflow.com/questions/5881107/how-can-i-build-entity-framework-queries-dynamically/5882243#5882243 – Euphoric

risposta

8

separata vostra ordinazione e il resto della query - le parti che sono gli stessi per ogni query non devi duplicare nel codebase (tenerlo DRY):

var query = customerList; 

if (sortDirection == "ASC") 
{ 
    if (sortBy == "Id") 
     query = query.OrderBy(x => x.Id); 
    ///and so on 
} 

query = query.Skip(startIndex).Take(pageSize).ToList(); 
+0

Questo è ancora un gran numero di piatti per tutti i campi, la riflessione non sarebbe molto più pulita? Immagina se avesse 50 campi! :) – mattytommo

+0

@NiklasB. Questo sarebbe un problema, perché OrderBy è generico e il lambda ha un tipo diverso per ogni proprietà. A meno che tu non voglia convertirlo in oggetto ovunque. – Euphoric

+0

@mattytommo: Questo è certamente possibile e ordinato se si tratta di una raccolta in memoria – BrokenGlass

2

Usa riflessione :)

customerList = (sortDirection == "ASC") 
    ? customerList 
     .OrderBy(x => x.GetType().GetProperty(sortBy).GetValue(x, null)) 
     .Skip(startIndex) 
     .Take(pageSize) 
     .ToList() 
    : customerList 
     .OrderByDescending(x => x.GetType().GetProperty(sortBy).GetValue(x, null)) 
     .Skip(startIndex) 
     .Take(pageSize) 
     .ToList(); 
1

Sembra che tu voglia semplicemente ordinare il nome della proprietà come una stringa. Nel qual caso, questo è in realtà già risolto utilizzando "Dynamic LINQ":

Dynamic LINQ OrderBy on IEnumerable<T>

Date un'occhiata a risposta di questa domanda e si dovrebbe fornire con il codice di esempio per risolvere il problema.

Problemi correlati