2012-06-27 19 views
1

我使用一些简单的LINQ在我的EF 4.3.1:为什么Linq2EF连接生成一个完整的外连接?

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 
    }) 

不幸的是,当我运行这个它永远将士。我已经将问题追踪到生成的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秒才能执行。如果我删除或/空块,它的股价下跌到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

根据微软的Data Type map,将被比较列的数据类型从Int64更改为Decimal,查询和性能显着提高。感谢Jon Skeet让我走上正确的道路。

相关问题