2011-08-18 3 views
2

을 부품을 제거 나는 다음과 같은 LINQ 쿼리가 : 카운트 방법이 지원되지 않습니다 가져 오기로LINQ - 표현의 나무

var query = session.Query<Event>() 
    .Fetch(e => e.Venue); // Fetch is an IQueryable extension which does a join 

// Code needed here to remove the fetch part 

var num = query.Count(); // This then hits the database 

불행하게도이 오류가 발생합니다. 이 단계에서 나는 왜 당신이 가져 오기 부분을 제거하지 않는지 생각하고 있다고 확신합니다. 그러나 나는 나의 예를 단순화 시켰으며 이것은 불가능하다. 내가 이상적으로 할 수있게하고 싶은 것은 LINQ 쿼리에 대한 표현 트리를 탐색하고 Count를 호출하기 전에 Fetch에 대한 모든 호출을 제거하는 것입니다.

다른 사람이 가능하다는 것을 보여 주면 감사하겠습니다. 감사합니다.

답변

3

LINQ to SQL 및 Entity Framework와 같은 O/RM 도구가이를 지속적으로 수행하기 때문에 런타임에 표현식 트리를 런타임에 변경할 수 있습니다 (기존 테이블에서 새 테이블을 작성). ExpressionVisitor 클래스의 .NET 4.0이 도입되면서 더 쉽게 될 수 있지만 여전히 간단 할 것으로 기대하지는 않습니다.

여기에 예를 보여주는 article이 있습니다.

var num = query.AsEnumerable().Count(); 

이 쿼리를 실행하는 것, 그 후시키기의 결과에 대한 간단한 카운트()를 대신한다 :

+0

고마워요.하지만 어떻게 내 자신의 Count 확장 메서드를 만드는 데 사용할 수있는 이해하는 동안, 나는 현재 식에서 가져 오기 호출을 제거하려면 ExpressionVisitor 클래스를 작성하는 방법에 대한 단서가 없을 것입니다. – nfplee

0

는이 같은이에() 열거 가능한 및 호출 횟수에 쿼리를 변환하는 데 도움이 될 것이다 Count()가 ExpressionTree로 흘러갑니다.

+0

고맙지 만이 방법의 문제점은 데이터베이스에서 모든 데이터를 가져 와서 큰 테이블에서 매우 느려지 게하는 것입니다. – nfplee

+1

@nfplee : 예, 이미 이런 일이 일어날 것이라고 생각했지만, 불행히도 저는 더 좋은 생각이 없습니다. :-( – Oliver