2

次の Linq クエリでは、生成された SQL は Count() の c.val != null チェックを無視します。

from t1 in table1
join t2 in table2 on t1.col1 equals t2.col1
where t1.col1 = 123 && t3.Count(c => c.val != null && c.col1 == t1.col1) == 0
select new {t1.col1, t2.col2, t1.col2}

それはに翻訳されます

SELECT [t0].[col1], [t1].[col2], [t0].[col2]
FROM [t1] AS [t0]
INNER JOIN [t2] AS [t1] ON [t0].[col1] = [t1].[col1]
WHERE ([t0].[col1] = @p0) AND (((
    SELECT COUNT(*)
    FROM [t3] AS [t2]
    WHERE [t2].[col1] = [t0].[col1]
    )) = @p1)

一方、次の場合のみ

t.Count(c => c.ID != null && t.No > 10)

それはに翻訳されます

SELECT COUNT(*) AS [value]
FROM [t] AS [t0]
WHERE ([t0].[ID] IS NOT NULL) AND ([t0].[No] > @p0)

ここでは c.ID != null チェックをスキップしていません。この動作が発生するのはなぜですか? where 句内での Count の使用に制限はありますか?

4

1 に答える 1

0

それは最適化のためです。In sql is null=null false, これは、最初の式で追加の is null チェックが必要ない理由を説明しています (Linq でのスマート リライト)。2 番目の式の変換は == を使用していないため、別の最適化が使用されます。この場合、パーサーは ([t0].[ID] IS NOT NULL) が SQL 式に値を追加しないことを認識しませんでした。

于 2012-09-27T11:22:07.857 に答える