2012-05-11 75 views
6

mam sprawdzanie parametr sortowania i budowania kilka if oświadczenia:Jak mogę poprawić ten kod sortowania?

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

Jak zrobić to lepiej?

+6

Zdefiniuj "lepiej". Lepiej na co? – Oded

+1

W jaki sposób chcesz go "ulepszyć"? Czy to nie działa zgodnie z przeznaczeniem? Czy to zbyt wolno? Czy nie podoba ci się struktura kodu? Potrzebujemy więcej informacji tutaj. –

+0

Polecam używanie kompozycji LINQ. Zobacz http://stackoverflow.com/questions/5881107/how-can-i-build-entity-framework-queries-dynamically/5882243#5882243 – Euphoric

Odpowiedz

8

oddzielić zamawiania i reszta zapytania - części, które są takie same dla każdego zapytania nie trzeba powielać w swoim kodzie (zachować to 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

To wciąż wiele elementów dla wszystkich pól, czy odbicie nie byłoby o wiele czystsze? Wyobraź sobie, że ma 50 pól! :) – mattytommo

+0

@NiklasB. Byłoby to problematyczne, ponieważ OrderBy ma charakter ogólny, a lambda ma inny typ dla każdej właściwości. Chyba, że ​​chcesz go przekonwertować na obiekt wszędzie. – Euphoric

+0

@mattytommo: To na pewno możliwe i zadbane, jeśli jest to kolekcja w pamięci – BrokenGlass

2

użyć refleksji :)

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

Wygląda na to, że chcesz po prostu zamówić przez nazwę właściwości jako ciąg znaków. W tym przypadku jest to rzeczywiście już rozwiązany za pomocą „Dynamic LINQ”:

Dynamic LINQ OrderBy on IEnumerable<T>

Spójrz na to pytanie odpowiedzieć i powinien dostarczyć próbki kodu, aby rozwiązać problem.