2013-07-17 2 views
7

IQueryable 객체에 해당 OrderModule이 표현식 트리에 적용되어 있는지 확인할 수있는 방법이 있습니까?Linq IQueryable에 적용된 주문이 있는지 확인하십시오.

내가 가진 시나리오는 그리드 컨트롤이 페이징을 활성화하고 열마다 정렬한다는 것입니다. 그러나 기본적으로 정렬이 적용되지 않으므로이 경우 Linq는 행 수를 엄청나게 엄선합니다. 따라서 모든 시나리오에서 주문을 제공해야하지만 기본 키로 기본 순서 만 적용해야합니다 다른 순서가 지정되어 있지 않은 경우.

이렇게 가능합니까?

+1

내가 생각할 수있는 유일한 방법은 orderby를 수행하고 순서가 동일한 지 확인하거나 주문할 때 부울을 설정하는 것입니다. 더 짧은 방법을 편집하면 요소를 비교하여 주문한 것인지 확인할 수 있습니다. – Sayse

+0

어떻게 될까요? orderby (id)는 엄청난 선택을 도와 줍니까? – usr

+0

@usr Linq2Sql은 기본 쿼리에 명시적인 orderby 기준이 적용되지 않은 경우 SELECT ROW_NUMBER() OVER (ORDER BY <모든 단일 열)에서 ALL COLUMNS를 사용합니다. 그래서 예를 들어, 순서없이 DB를 실행하는 데 30 초가 걸리지 만 orderby가 적용될 때 1 초 미만이 소요되는 쿼리가 있습니다. 따라서 명시 적으로 기본 키를 orderby로 설정하면 그리드 정렬 식에서 자동 orderby 세트가없는 경우 심하게 구성된 Linq 쿼리로 인해 많은 시간을 낭비하지 않을 수 있습니다. – Grofit

답변

6

사용자 지정 ExpressionVisitor 또는 원하는 재귀 탐색 메커니즘을 사용하여 쿼리의 식 트리를 검사하여 확인할 수 있습니다.

나는 당신의 코드가 잘 디자인되어 있지 않다는 것을 느낍니다. 주문은 bool으로 어딘가에 적용되었다는 사실을 그냥 저장해야합니다. 어쩌면 앱의 정보 흐름을 재구성해야 할 수도 있습니다.

이 검사 방법을 사용하면이 정보를 해킹으로 복구 할 수 있습니다.

+0

오, 예, 틀림없이 내 마음에 의심의 여지가 없습니다. 불행히도 선사 시대의 고객 선택에 제약이 있기 때문에 근본적인 문제를 해결할 수있는 선택권이 제한되어 있고 그리드 컨트롤에 기본 정렬을 적용 할 수 있지만 어쨌든 정렬을 해제 할 수 있습니다 그리드에서 사용되기 전에 처리를위한 공통 인터페이스를 통과하므로 기본 쿼리에서 문제를 일으킬 수 있습니다. – Grofit