2012-06-27 3 views
1

내 EF 4.3.1에서 몇 가지 간단한 LINQ를 사용하고 있습니다 :Linq2EF Join이 왜 완전 외부 조인을 생성합니까?

Dim Results = (
    From T1 In Context.Table1 
    Where T1.IDColumn = 1568 
    Join T2 In Context.Table2 On T1.IDColumn Equals T2.IDColumn 
    Select New With { 
     .Quantity = T1.Quantity 
    }) 

을 나는 영원히 takeing있어이 실행 불행하게도 때. 그리고 나는 문제를 생성 된 SQL의 완전히 불필요한 부분으로 보이는 것으로 추적했습니다. 생성 된 SQL은 다음과 같습니다.

SELECT 1 AS "C1" 
     ,CAST("Extent2"."Quantity" AS number(19,0)) AS "C2" 
FROM [table1] "Extent1" 
INNER JOIN [table2] "Extent2" ON 
(
    ( 
    CAST("Extent1"."IDColumn" AS number(19,0)) 
) = (
    CAST("Extent2"."IDColumn" AS number(19,0)) 
) 
) 
OR 
(
    ( 
    CAST("Extent1"."IDColumn" AS number(19,0)) IS NULL 
) 
    AND 
    ( 
    CAST("Extent2"."IDColumn" AS number(19,0)) IS NULL 
) 
) 
WHERE 
(
    1568 = ( 
    CAST("Extent1"."ForeginKey" AS number(19,0)) 
) 
) 

이 쿼리는 약 13 초 정도 걸립니다. 나는 OR/NULL 블록을 제거하는 경우는 0.122 초에 내려 간다 :

SELECT 1 AS "C1" 
      ,CAST("Extent2"."Quantity" AS number(19,0)) AS "C2" 
    FROM [table1] "Extent1" 
    INNER JOIN [table2] "Extent2" ON 
    (
     ( 
     CAST("Extent1"."IDColumn" AS number(19,0)) 
    ) = (
     CAST("Extent2"."IDColumn" AS number(19,0)) 
    ) 
    ) 
    WHERE 
    (
     1568 = ( 
     CAST("Extent1"."ForeginKey" AS number(19,0)) 
    ) 
    ) 

사람은 내가 LINQ 쿼리는 (원치 않는) 널 (null) 검사를 생성하지 얻을 수있는 방법에 대한 제안이?

+1

.NET 모델과 데이터베이스에있는 'IDColumn'유형은 무엇입니까? –

+0

데이터베이스에서 필드 형식은 Number (10,0)이고 .NET에서는 Int64에 매핑되었습니다. –

답변

0

비교 대상 열의 데이터 형식을 Microsoft의 Data Type map에 따라 Int64에서 Decimal로 변경하여 쿼리와 성능이 크게 향상되었습니다. Jon Skeet에게 감사의 말을 전합니다.

관련 문제