2014-02-22 2 views
0

정렬과 관련하여 아래의 코드가 잘못된 점은 무엇입니까? 정렬 코드는 히트되지만 정렬은 결과에 절대로 적용되지 않습니다.IQueryable 정렬 작동하지 않음

var results = new List<Location>(); 

var county = context.boc_County.Where(x => x.Description.Contains(phrase.ToLower())).ToList(); 
results.AddRange(_mapper.MapCountyFromDb(county)); 

var town = context.boc_Town.Where(x => x.Description.Contains(phrase.ToLower())).ToList(); 
results.AddRange(_mapper.MapTownFromDb(town)); 

if (orderBy == "Identifier") 
{ 
    if (direction == "ASC") 
     results = results.OrderBy(x => x.Identifier); 
    else 
     results = results.OrderByDescending(x => x.Identifier); 
} 

if (orderBy == "Type") 
{ 
    if (direction == "ASC") 
     results = results.OrderBy(x => x.LocationType.ToString()); 
    else 
     results = results.OrderByDescending(x => x.LocationType.ToString()); 
} 

if (orderBy == "Description") 
{ 
    if (direction == "ASC") 
     results = results.OrderBy(x => x.Description); 
    else 
     results = results.OrderByDescending(x => x.Description); 
} 

var model = new LocationSearchResult() 
{ 
    Locations = query.Skip(page * pageSize).Take(pageSize), 
    TotalCount = query.Count() 
}; 
return model; 
+0

당신이'Queryable에서를 사용하는 이유 '여기에? 메모리 컬렉션을 가지고 있는데 (ToList를 사용하고 있습니다.) 그래서'IEnumerable '으로 유지하지 않으시겠습니까? AsQueryable을 사용하면 더 복잡해집니다. 또한 다양한 변수 값이 무엇인지 알지 못합니다 ... 문제를 보여주는 짧지 만 완전한 예제를 제공하면 훨씬 더 좋습니다. –

+0

나는 아무것도 잘못 볼 수 없다. 물건을 삭제하여 코드를 단순화하십시오. 당신은 그것이 결국 작동한다는 것을 알게 될 것입니다. 범인은 방금 삭제 한 것입니다. – usr

+0

간단한 설명 :'orderBy'는 당신이 테스트 한 문자열과 결코 일치하지 않습니다. 디버거를 사용하면 이러한 버그를 쉽게 찾을 수 있습니다. – usr

답변

1

OrderByOrderByDescending는 대신 새로운 IQueryable/IEnuemrable을 반환, 발신자를 변경하지 마십시오. 다른 변수 (또는 같은 변수)에 다시 할당해야합니다. 그렇지 않으면 그들을 부르는 것은 의미가 없습니다.

추가 ToList()이 컴파일 수 있도록 전화 작업을 추가하는 당신이 List<T>을 사용하기 때문에 :

if (orderBy == "Identifier") 
{ 
    if (direction == "ASC") 
     results = results.OrderBy(x => x.Identifier).ToList(); 
    else 
     results = results.OrderByDescending(x => x.Identifier).ToList(); 
} 
// (...) 

또는 대신 List<T>.Sort를 사용할 수 있습니다

if (orderBy == "Identifier") 
{ 
    if (direction == "ASC") 
     results.Sort((x1, x2) => x1.Compare(x2)); 
    else 
     results.Sort((x1, x2) => x2.Compare(x1)); 
} 
+0

이것은 변경된 코드에서만 나타납니다. 이 문제가이 질문의 "데모"코드에만 존재하는지 확실하지 않습니다. – usr

+0

이것은 정답입니다. 할당이 필요하고 추가 ToList()가 필요합니다. –