2012-05-11 5 views
6

나는 정렬 매개 변수를 확인하고 if 문의 무리 짓고 있어요 :이 분류 코드를 개선하려면 어떻게해야합니까?

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

가 어떻게이 더 나은 만들 수 있죠을?

+6

"더 나은"정의. 무엇을 위해서? – Oded

+1

어떤면에서 "개선"하고 싶습니까? 의도 한대로 작동하지 않습니까? 너무 느린가요? 코드가 어떻게 구성되어 있는지 마음에 들지 않으십니까? 여기에 더 많은 정보가 필요합니다. –

+0

LINQ 구성을 사용하는 것이 좋습니다. http://stackoverflow.com/questions/5881107/how-can-i-build-entity-framework-queries-dynamically/5882243#5882243 – Euphoric

답변

8

분리하여 주문 및 쿼리의 나머지 부분 - 당신은 당신의 코드베이스에서 중복 필요가 없습니다 각 쿼리에 대해 동일 부품 (그것을 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

아직 모든 분야에 대해 많은 상용구가 있습니다. 훨씬 더 깨끗해 보이지 않을까요? 그가 50 개의 들판을 가지고 있다고 상상해보십시오! :) – mattytommo

+0

@ NiklasB. 이는 OrderBy가 일반적이고 람다가 모든 속성에 대해 다른 유형을 가지기 때문에 문제가됩니다. 개체를 모든 곳의 개체로 변환하지 않는 한. – Euphoric

+0

@mattytommo : 이것이 메모리 내 컬렉션 인 경우 확실히 가능하고 깔끔합니다. – BrokenGlass

2

사용 반사 :)

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

단순히 속성 이름을 문자열로 정렬하려는 것 같습니다. 이 경우,이 사실은 이미 "동적 LINQ"을 사용하여 해결된다 :

Dynamic LINQ OrderBy on IEnumerable<T>

이 질문의 대답에서 봐, 그리고 당신의 문제를 해결하기 위해 샘플 코드를 제공해야합니다.

관련 문제