2012-06-27 2 views
1

Я использую некоторые простые LINQ в моей EF 4.3.1:Почему 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 секунд. Если удалить блок/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, чтобы не генерировать (нежелательные) нулевые чеки?

+1

Каков тип 'IDColumn' в вашей модели .NET и в базе данных? –

+0

В базе данных тип поля - Number (10,0), в .NET. Я сопоставлен с Int64 –

ответ

0

Изменен тип данных столбца, сравниваемого с Int64 до десятичного, в соответствии с Microsoft Data Type map, а запрос и производительность значительно улучшились. Спасибо Джону Скиту за то, что он на правильном пути.

Смежные вопросы