I’m using some simple LINQ in my EF 4.3.1:
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
})
Unfortunately when I run this it’s takeing forever. And I’ve tracked the problem down to what appears to be a completely unneccessary portion of the generated SQL. The generated SQL looks like this:
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))
)
)
This query takes about 13 seconds to execute. If I remove the OR / NULL block, it goes down to 0.122 seconds:
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))
)
)
Anyone have suggestions for how I can get the linq query to not generate the (undesired) null checks?
Changed the data type of the column being compared from Int64 to Decimal, per Microsoft’s Data Type map, and the query and performance improved dramatically. Thanks to Jon Skeet for getting me on the right path.