내가 좋아하는 것이었다 내 엔티티 프레임 워크 모델에 대한 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의 쿼리 계획 최적화 도구는 정말 대단합니다!
실행 계획이 동일하다는 마지막 점이 spot-on입니다. Field5에서 Field8까지는 상위 쿼리에서 전혀 사용되지 않으므로 옵티마이 저는 하위 쿼리에서이를 무시합니다. 당신이 얻을 수있는 유일한 절약은 전선을 가로 질러 몇 여분의 쿼리 텍스트를 보내지 않을 것입니다. –