2011-12-18 2 views
1

3 년 후 Entity Framework v.X를 사용하여 EF4에서 이상한 동작을 보았습니다. 사실은 그 : 데이터베이스 AdventureWork에Entity Framework 4와 T-SQL 쿼리 결과가 일치하지 않습니다.

, 나는 다음과 같은 명령을 실행 :

SELECT 
[Project1].[ProductID] AS [ProductID], 
[Project1].[C1] AS [C1], 
[Project1].[ProductID1] AS [ProductID1], 
[Project1].[DocumentID] AS [DocumentID], 
[Project1].[ModifiedDate] AS [ModifiedDate] 
FROM (SELECT 
     [Extent1].[ProductID] AS [ProductID], 
     [Extent2].[ProductID] AS [ProductID1], 
     [Extent2].[DocumentID] AS [DocumentID], 
     [Extent2].[ModifiedDate] AS [ModifiedDate], 
     CASE WHEN ([Extent2].[ProductID] IS NULL) THEN CAST(NULL AS int) ELSE 1 
END AS [C1] 
     FROM [Production].[Product] AS [Extent1] 
     LEFT OUTER JOIN [Production].[ProductDocument] AS [Extent2] ON ([Extent1].[ProductID] = [Extent2].[ProductID]) AND ([Extent2].[ProductID] = [Extent1].[ProductID]) 
) AS [Project1] 
ORDER BY [Project1].[ProductID] ASC, [Project1].[C1] ASC 

가 일단 SSMS에서 실행 :

var query = (ObjectQuery) context.Products.Select(p => p.ProductDocuments.Where(c => c.ProductID == p.ProductID)); 
Console.WriteLine(query.ToTraceString()); 

ToTraceSstring()이 실행됩니다 실제 쿼리를 보여줍니다 505 행을 표시합니다. 내가 EF에서 실행하려고 할 때

그러나 :

var query= context.Products.Select(p => p.ProductDocuments.Where(c => c.ProductID == p.ProductID)); 
Console.WriteLine(query.Count()); 

만 504 선을 반환합니다.

결과를 비교 한 결과, 동일한 ProductID = 506을 갖는 ProductDocument에는 두 개의 행이있는 것으로 보입니다. 이는 완전히 정상입니다. 이러한 중복 행은 예상대로 두 번이 아닌 한 번만 검색됩니다.

그 문제에 대한 아이디어가 있으십니까?

답변

1

당신은 점에서 올바른 사용자의 람다 식의 순진한 해석은 단순히 요구하고있다 함축 :

SELECT Products.* 
FROM Products 
INNER JOIN ProductDocuments 
    ON ProductDocuments.ProductID = Products.ProductID 

대신지고있다 : 그러나

SELECT DISTINCT Products.* 
FROM Products 
INNER JOIN ProductDocuments 
    ON ProductDocuments.ProductID = Products.ProductID 

, 당신이 확신 당신이 게시 한 SQL은 코드가 Product entity를 요청하는 동안 SQL이 문서의 일부를 반환하기 때문에 코드 결과입니다. 물론 일련의 제품에 대해 중복 된 엔터티를 반환하는 것은 무의미하고 올바르지 않습니다.

1

SQL이 정확합니다. 그리고 LEFT OUTER JOIN은 그 요청에서 기대됩니다.

하지만 질문은 이제 쿼리 결과가 동일하지 않은 이유입니다. ToTraceString()의 가짜 해석이 있습니까? 나는 리플렉터를 사용하여 IQueryable을 읽을 때 내비게이션이 어떻게 보이는지를 가장 근접하게 살펴 본다.

관련 문제