2014-09-05 4 views
0

두 개체를 Entity Framwork에 연결하고 모든 조건을 Where 절에 넣었습니다. 하지만 내 상사는보다 효율적인 다른 조건을 Where 술어에 넣으려고했다. 아래처럼 첫 번째 버전은 내 버전입니다 -Where 조인 조건 Where 조인 Where Where 절

var query = from ct in dbContext.ClaimTrackings 
              join cts in dbContext.ClaimTrackingStatus 
              on ct.ID equals cts.ClaimTrackingID 
              where ct.CenterID == centerID && ct.ClaimMonth == SharePointClaimProcessingData.ClaimMonth && ct.ClaimYear == SharePointClaimProcessingData.ClaimYear 
              select cts; 




var query = from ct in dbContext.ClaimTrackings.Where(p => p.CenterID == centerID && p.ClaimMonth == SharePointClaimProcessingData.ClaimMonth && p.ClaimYear == SharePointClaimProcessingData.ClaimYear) 
              join cts in dbContext.ClaimTrackingStatus 
              on ct.ID equals cts.ClaimTrackingID 
              select cts; 

이 코드는 프로덕션에서만 실행할 수 있으므로 생성 된 스크립트를 볼 수 없습니다. 어느 것이 더 효율적인 지 잘 모르겠습니다. 그러니 설명해주십시오.

+1

했다 - 당신이 생성 년대 SQL을 확인했다 당신은이 쿼리를 실행합니까? 열거 전에 발생하는 모든 항목은 단일 저장소 표현식으로 변환되므로 동일한 결과가 반환되므로 쿼리/계획이 동일 할 가능성이 큽니다. 나는 당신을 위해 유사한 조인을 시도 할 수있다. – Charleh

+0

내 업데이트 된 글보기. 일부 제약으로 인해 로컬로 실행할 수 없다. –

+0

아마도 약간의 시간이 지나면 샘플 프로젝트를 만들고 실행할 수 있습니다. 하지만 전문가의 의견을 듣고 싶습니다. –

답변

0

좋아요. 결과가 같으므로 몇 가지 테스트를 완료했으며 올바른 결과를 얻었으므로 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 문을 생성하는 것처럼 보이는