1

내가 좋아하는 것이었다 내 엔티티 프레임 워크 모델에 대한 LINQ 쿼리했다 Linq에 대 어디에요() :Linq2Entities + 엔티티 프레임 워크 쿼리 최적화 :

from e1 in context.Entity1 
from e2 in context.Entity2 
from e3summary in 
    from e3 in context.Entity3 
    where e3.Field1 = value // <-- this is the line in question 
    group e3 by new { e3.Field1, e3.Field2, e3.Field3 } 
     into e3group 
     select new 
     { 
      e3group.Key.Field1, 
      e3group.Key.Field2, 
      e3group.Key.Field3, 
      Total = e3group.Sum(o => o.Field4) 
     } 
where 
    // conditions on e1 and joining e1, e2, and e3summary 
    ... 

select e1; 

생성 된 SQL을에서 모두를 선택하고 내 e3 테이블 (실제로는 데이터베이스의 뷰)을 파생 테이블로 사용한 다음 파생 테이블에 대해 where 절을 적용하고 그룹화 한 다음 다른 결과에 합류합니다. 그게 거의 내가 원했던 것입니다. 나는 전체 e3 뷰를 그룹으로 묶을 필요가 없다는 것을 제외하고는 (테스트 데이터베이스에 73M 레코드, 생산량이 거의 800M). (나는 단지 관련 부분을 포함하고있어) 내 LINQ 쿼리의 WHERE 절은 가장 안쪽 수준에서 적용 할 것으로 예상했지만, 대신에 나는 점점했다 : 나는

에서 내 LINQ 쿼리를 변경

... 
INNER JOIN (SELECT 
    [Extent3].[Field1] AS [K1], 
    [Extent3].[Field2] AS [K2], 
    [Extent3].[Field3] AS [K3], 
    SUM([Extent3].Field4] AS [A1] 
    FROM (SELECT 
     [e3].[ID] AS [ID], 
     [e3].[Field1] AS [Field1], 
     [e3].[Field2] AS [Field2], 
     [e3].[Field3] AS [Field3], 
     [e3].[Field4] AS [Field4], 
     [e3].[Field5] AS [Field5], 
     [e3].[Field6] AS [Field6], 
     [e3].[Field7] AS [Field7], 
     [e3].[Field8] AS [Field8] 
     FROM [dbo].[e3] AS [e3]) AS [Extent3] 
      WHERE ([Extent3].[Field1] = @p__linq__0) 
      GROUP BY [Extent3].[Field1], [Extent3].[Field2], [Extent3].[Field3]) AS [GroupBy1] 
    ... 

from e3 in context.Entity3 
    where e3.Field1 = value // <-- this is the line in question 

from e3 in context.Entity3.Where(e => e.Field1 = value) 

-

이 내가 원래 기대했던 만든, 가장 안쪽 수준에서 WHERE 절 :

 ... 
     FROM [dbo].[e3] AS [e3] WHERE [e3].Field1] = @p__linq__0) AS [Extent3] 
      GROUP BY [Extent3].[Field1], [Extent3].[Field2], [Extent3].[Field3]) AS [GroupBy1] 

내 문맥의 컬렉션에 대해 .Where([condition])을 직접 적용 할 때와 내 Linq 쿼리에서 where [condition]을 사용하는 경우의 차이점은 무엇입니까? 나는 이것이 같은 방식으로 표현 트리로 파싱 될 것이라고 생각할 것이다.

P. SQL Server Management Studio에 두 쿼리를 넣고 쿼리 실행 계획을 비교하는 사이드 상 (sidenote)에서 나는 실행 계획이 정확히 어느 쪽이든 마찬가지라는 사실에 놀랐습니다. SQL의 쿼리 계획 최적화 도구는 정말 대단합니다!

+0

실행 계획이 동일하다는 마지막 점이 spot-on입니다. Field5에서 Field8까지는 상위 쿼리에서 전혀 사용되지 않으므로 옵티마이 저는 하위 쿼리에서이를 무시합니다. 당신이 얻을 수있는 유일한 절약은 전선을 가로 질러 몇 여분의 쿼리 텍스트를 보내지 않을 것입니다. –

답변

3

이러한 쿼리의 차이점은 사용한 구문을 나타내는 데 있습니다. 이 구성되고, 외부의 식 트리에 부착되어야하는 별도의 발현 서브 트리로 간주되기 때문에 제 쿼리

from e3 in (context.Entity3.Where(e => e.Field1 == value)) 

점선 구로서 평가되는 반면, 제 쿼리

(from e3 in context.Entity3) where e3.Fied1 == value 

으로 평가가 우선 질문. 귀하의 예제에서 볼 수 있듯이 하위 쿼리 일 필요는 없지만 하위 쿼리로 생각할 수도 있습니다.

+0

그래서 나는 항상 *. * (조건)을 사용해야합니까? SQL 쿼리 실행 계획의 결과가 실제로 어느 쪽이든 상관 없다는 것을 알 수 있습니다. –

+0

중요하지 않습니다. –