1

EF4.3.1でいくつかの単純なLINQを使用しています。

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秒かかります。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))
      )
    )

(望ましくない)nullチェックを生成しないようにlinqクエリを取得する方法について誰かが提案していますか?

4

1 に答える 1

0

Microsoftのデータ型マップに従って、比較対象の列のデータ型をInt64からDecimalに変更し、クエリとパフォーマンスが大幅に向上しました。私を正しい道に導いてくれたJonSkeetに感謝します。

于 2012-06-27T18:56:10.210 に答える