2013-06-07 4 views
6

저는 LINQ 표현 트리에 통계 데이터를 수집하는 간단한 IQueryableIQueryProvider 클래스를 구현했습니다. 이 부분은 잘 작동합니다. 다음으로, 식 트리를 기본 LINQ-to-Objects 공급자에게 전달하여 평가를 수행하고 싶습니다. 다른 방식으로 실행하지 않아도됩니다. 즉, 공급자가 기본 LINQ 구현에 쿼리를 전달하여 부작용으로 통계를 수집하도록합니다.LINQ 패스 스루 공급자?

그러나 기본 공급자에 대한 핸들을 가져 오는 데 어려움이 있습니다. 내가 좋아하는 나는 단순히 원래 IEnumerable 컬렉션에 대한 참조를 저장하고 (내 사용자 지정 IQueryable에서) 디폴트의 프로 바이더를 돌려 수 있다고 생각 :

IQueryProvider IQueryable.Provider 
{ 
    get { return _my_provider.OriginalIEnum().AsQueryable().Provider; } 
} 

하지만이 제대로 작동하지 않습니다. 코드는 결국 StackOverflowException을 던집니다. 내가 라고 생각하면이 발생합니다 (디버깅 모드에서 단일 스테핑에서 수집). 위의 메서드에서 LINQ 런타임이 공급자를 가져온 다음 사용자 지정 IQueryable에서 식 트리를 가져온 다음 최상위 수준 표현은 내 사용자 정의 IQueryable입니다. 따라서 적절한 프로 바이더를 찾기 위해 프로세스를 다시 시작합니다. 이 작업은 스택 오버플로가 발생할 때까지 끝없이 수행됩니다.

는 바로 지금, 내가 생각할 수있는 유일한 것은 LINQ 런타임이 기본 제공 업체에 연락 할 수 있도록 제거 사용자 정의 IQueryable 노드와 다른 식 트리를 생성하는 또 다른 방문자 마련하는 것입니다. 이것은 내 잎이 내 사용자 정의 IQueryable을 다시 호출 할 수있는 중첩이 없도록하기 위해 모든 잎을 방문해야하기 때문에 상당한 양의 작업입니다. 더 간단한 접근법이 있습니까?

도움 주셔서 감사합니다.

+0

그렇다면 공급자가 자살하고있는 곳에서 재귀가 있습니까? – gunr2171

+0

정확히. 나는 당황 스럽다. 왜냐하면 나는 원래 공급자에 대한 참조를 얻고 있어야한다고 믿기 때문이다. –

답변