2015-01-15 8 views
3

저는 EF 코드를 먼저 사용하고 있습니다. Oracle 데이터베이스에 대해 Linq To SQL을 사용하고 있습니다. 간단히하기 위해 시나리오를 다시 시작하겠습니다. 나는이 같은 테이블 제품이 있다고 가정합니다 :IQueryable.ToList 메소드가 T-SQL 정렬 순서로 어지럽 혀졌습니다.

ProductName (varchar) 
A 
1 
C 
2 
B 
3 
4 

글쎄, 내가 EF를 사용하여 쿼리를 작성 : 나는 디버깅 할 때

var query = Repo.Products.AsQueryable().OrderBy(p => p.ProductName); 

, 내가 생성 된 T-SQL을 얻고 오라클에서 실행을, 모든게입니다 좋습니다, 결과 집합은 다음과 같습니다.

문자의 우선 순위를 고려할 때 적합합니다 (필드는 varchar/string 임). 지금 내가 할 경우 다음과 같은 확인

:

var list = query.ToList(); 

결과는 다음과 같습니다

A 
B 
C 
1 
2 
3 
4 

이 잘못이며, 오라클 결과 집합에서 다른. OrderBy() 전에 ToList()를 호출하면 결과가 올바르게 정렬되지만 필터링하기 전에 모든 레코드를 가져 오지 않도록 ToList()를 호출하지 않습니다.

저는 정말이 문제에 열중하고 있습니다. 누구든지 도울 수 있니?

+0

여기에 다른 현상이 있습니까? 나는 이것을 끝까지 재현 할 수 없다. – IronMan84

+0

아무 것도 아니지만, 오라클 데이터베이스에 대한 모든 linq 쿼리는 orderby를 사용하여 숫자 앞에 문자를 배치합니다. 생성 된 T-SQL이 정확하고 완벽하게 순서가 테스트 된 경우에도 마찬가지입니다. 벌써 화가 나있어. –

+0

결과를 가져 와서 객체 목록으로 변환 할 때 ToList에 문제가있는 것처럼 보입니다. ToList 메서드를 디버깅하는 방법이 있습니까? –

답변

0

알았습니다.

문제점은 Oracle의 NLS_SORT 변수입니다. 이상한 일은 PL/SQL 관리자 개발자가 먼저 숫자를 사용하여 "올바른"순서를 보여 주지만 NLS_SORT 변수 세션이 변경되어 다른 동작이 발생하는 이유는 Entity Framework가 그렇지 않기 때문입니다.

쿼리를 실행하기 전에 NLS_SORT를 'BINARY'로 설정하면됩니다.

해결!

감사합니다.