2012-05-11 12 views
6

Estoy comprobando el parámetro de clasificación y la construcción de un montón de if declaraciones:¿Cómo puedo mejorar este código de clasificación?

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

¿Cómo puedo hacer esto mejor?

+6

Definir "mejor". Mejor para que? – Oded

+1

¿De qué manera quieres "mejorarlo"? ¿No funciona como se esperaba? ¿Es muy lento? ¿No te gusta cómo está estructurado el código? Necesitamos más información aquí. –

+0

Lo recomendaría usando la composición LINQ. Consulte http://stackoverflow.com/questions/5881107/how-can-i-build-entity-framework-queries-dynamically/5882243#5882243 – Euphoric

Respuesta

8

independiente de su pedido y el resto de la consulta - las partes que son las mismas para cada consulta que no tiene que duplicar en su base de código (mantenerla 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

Eso sigue siendo una gran repetición de todos los campos, ¿no sería la reflexión mucho más limpia? ¡Imagínese si tuviera 50 campos! :) – mattytommo

+0

@NiklasB. Eso sería un problema, porque OrderBy es genérico y el lambda tiene un tipo diferente para cada propiedad. A menos que quiera convertirlo a objeto en todas partes. – Euphoric

+0

@mattytommo: Eso es ciertamente posible y ordenado si se trata de una colección en la memoria – BrokenGlass

2

Uso reflexión :)

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

Parece que simplemente desea ordenar por el nombre de la propiedad como una cadena. En cuyo caso, este es en realidad ya se resolvió mediante el uso de "Dynamic LINQ":

Dynamic LINQ OrderBy on IEnumerable<T>

Tome un vistazo a la respuesta de esta pregunta y se debe proveer de código de ejemplo para resolver su problema.

Cuestiones relacionadas