좋아요. 결과가 같으므로 몇 가지 테스트를 완료했으며 올바른 결과를 얻었으므로 Where 절을 위로 이동해도 아무런 차이가 없습니다. 확실히 SQL Server에 대한 것입니다.
var query = from ct in _context.Batches
join cts in _context.Blends
on ct.BatchId equals cts.BatchId
where ct.BatchId == 13349 && ct.CreatedBy == "Automation"
select cts;
var query2 = from ct in _context.Batches.Where(x => x.BatchId == 13349 && x.CreatedBy == "Automation")
join cts in _context.Blends
on ct.BatchId equals cts.BatchId
select cts;
동등한 질의 :
SELECT
[Extent2].[BlendId] AS [BlendId],
[Extent2].[BatchId] AS [BatchId],
[Extent2].[BlendNumber] AS [BlendNumber],
[Extent2].[ProductCode] AS [ProductCode],
[Extent2].[TargetQuantity] AS [TargetQuantity],
[Extent2].[RecipeDescription] AS [RecipeDescription],
[Extent2].[BlenderId] AS [BlenderId],
[Extent2].[TestingSetDescription] AS [TestingSetDescription],
[Extent2].[SieveDefaultDescription] AS [SieveDefaultDescription],
[Extent2].[ReblendTime] AS [ReblendTime],
[Extent2].[Operator] AS [Operator],
[Extent2].[ProcessedBy] AS [ProcessedBy],
[Extent2].[KeggedBy] AS [KeggedBy],
[Extent2].[ApprovedBy] AS [ApprovedBy],
[Extent2].[ActualQuantity] AS [ActualQuantity],
[Extent2].[TestedBy] AS [TestedBy],
[Extent2].[TestStatus] AS [TestStatus],
[Extent2].[ApprovedQuantity] AS [ApprovedQuantity],
[Extent2].[CreatedDate] AS [CreatedDate]
FROM [dbo].[Batches] AS [Extent1]
INNER JOIN [dbo].[Blends] AS [Extent2] ON [Extent1].[BatchId] = [Extent2].[BatchId]
WHERE (13349 = [Extent1].[BatchId]) AND (N'Automation' = [Extent1].[CreatedBy])
그리고
그냥 우리의 클라이언트 (단지 광산에 대한 귀하의 엔티티 이름을 바꾼) 애플 리케이션 중 하나의 맥락에서이 두 쿼리를 실행
SELECT
[Extent2].[BlendId] AS [BlendId],
[Extent2].[BatchId] AS [BatchId],
[Extent2].[BlendNumber] AS [BlendNumber],
[Extent2].[ProductCode] AS [ProductCode],
[Extent2].[TargetQuantity] AS [TargetQuantity],
[Extent2].[RecipeDescription] AS [RecipeDescription],
[Extent2].[BlenderId] AS [BlenderId],
[Extent2].[TestingSetDescription] AS [TestingSetDescription],
[Extent2].[SieveDefaultDescription] AS [SieveDefaultDescription],
[Extent2].[ReblendTime] AS [ReblendTime],
[Extent2].[Operator] AS [Operator],
[Extent2].[ProcessedBy] AS [ProcessedBy],
[Extent2].[KeggedBy] AS [KeggedBy],
[Extent2].[ApprovedBy] AS [ApprovedBy],
[Extent2].[ActualQuantity] AS [ActualQuantity],
[Extent2].[TestedBy] AS [TestedBy],
[Extent2].[TestStatus] AS [TestStatus],
[Extent2].[ApprovedQuantity] AS [ApprovedQuantity],
[Extent2].[CreatedDate] AS [CreatedDate]
FROM [dbo].[Batches] AS [Extent1]
INNER JOIN [dbo].[Blends] AS [Extent2] ON [Extent1].[BatchId] = [Extent2].[BatchId]
WHERE (13349 = [Extent1].[BatchId]) AND (N'Automation' = [Extent1].[CreatedBy])
당연히 동일합니다. EF가 쿼리를 생성하는 데 사용하는 정확한 메커니즘을 제공 할 수는 없지만 기본적으로 두 테이블을 결합하여 저장소 쿼리에 대한 변환을 수행하면 동일한 엔터티가 포함 된 엔터티를 보는 방식이 같아 질 가능성이 높습니다
그래서,이 경우, 두 번째 상사 추측 (뭔가를 내가 항상 할) 올바른 :
가 예상하는 것과 동일하거나 동등한 SQL 문을 생성하는 것처럼 보이는
했다 - 당신이 생성 년대 SQL을 확인했다 당신은이 쿼리를 실행합니까? 열거 전에 발생하는 모든 항목은 단일 저장소 표현식으로 변환되므로 동일한 결과가 반환되므로 쿼리/계획이 동일 할 가능성이 큽니다. 나는 당신을 위해 유사한 조인을 시도 할 수있다. – Charleh
내 업데이트 된 글보기. 일부 제약으로 인해 로컬로 실행할 수 없다. –
아마도 약간의 시간이 지나면 샘플 프로젝트를 만들고 실행할 수 있습니다. 하지만 전문가의 의견을 듣고 싶습니다. –