2017-09-15 1 views
0

문자열을 정수로 정렬하기 위해 속성의 길이와 속성 순으로 Linq 쿼리의 결과를 정렬하려고하지만 생성 된 SQL 기대했던대로 주문하지 않습니다.Linq OrderBy 문자열 속성 길이가 선택 목록에 있어야합니다

내가, 그것을 아래로 필터링, 여러 테이블을 조인과 함께 밖으로 DTO를 선택하고 :

다음
query = basequery.Select(s => new HeadersDTO 
{ 
    headerid = s.Header.id, 
    orderno = s.Header.orderno, 
    customer = s.Header.customer, 
    dateoforder = s.Header.dateoforder, 
    consignee = s.Location.name, 
    city = s.Location.name, 
    state = s.Location.state 
}).Distinct(); 

주문하려고는 정상적인 방법으로 문자열 정렬이 여전히 주문을

query = query.OrderByDescending(x => x.orderno.Length).ThenByDescending(x => x.orderno) 
.Skip(() => offset).Take(() => criteria.per_page); 

s.Header.orderno에 의해 첫 번째 문자가 우선합니다.

하지만 내가 x.orderno.Length을 선택하면 자신의 속성이 나옵니다.

query = basequery.Select(s => new HeadersDTO 
{ 
    ordernolength = s.Header.orderno.Length <---- added this 
    headerid = s.Header.id, 
    orderno = s.Header.orderno, 
    customer = s.Header.customer, 
    dateoforder = s.Header.dateoforder, 
    consignee = s.Location.name, 
    city = s.Location.name, 
    state = s.Location.state 
}).Distinct(); 

query = query.OrderByDescending(x => x.ordernolength).ThenByDescending(x => x.orderno) 
.Skip(() => offset).Take(() => criteria.per_page); 

내가 선택 목록에서 새 속성을 만들 필요가 없습니다 곳이 할 수있는 방법이 있나요 ? 필요한 경우 더 많은 정보를 추가 할 수 있습니다.

+0

'query.OrderByDescending (X =>에서 Int32.Parse (x.orderno))' –

+0

이 숫자를 기반으로 문자열이 orderNo가 도움이 : 다음은 이에 대한 예입니다? –

+0

@SamAxe 이전에 본 적이 있지만 'Linq To Entities가 Int32 Parse' 오류를 인식하지 못합니다. –

답변

0

이 필드에 대해 Int32 체크를 수행하는 IComparer을 사용하여 사용자 지정 Comparer을 만들어보십시오.

Use own IComparer<T> with Linq OrderBy

희망이

+0

또는 비교자를 사용하여 예와 같이 '길이'와 비교할 수도 있습니다. –

+2

'IComparer '는 쿼리가 SQL을 투영하는 데 사용되고 있기 때문에 도움이되지 않습니다. 바이너리 IComparer 코드 기능을 SQL로 프로젝트 할 수있는 ORM을 모르겠습니다. 그렇습니까? – ErikE

+0

아 맞아. (미안해. –