そのため、EF がアプリ用に生成するクエリを掘り下げていたところ、奇妙な sqlAny
呼び出しの生成に気付きました。それらは過度に複雑なようです。Any
生成するように見える-elsecase when (x) then 1 when (not x) then 0 end
だけを使用しないのはなぜですか? Any
このように、SQL サーバーは、返すべき場合に同じクエリを 2 回実行する必要がありfalse
ます。を使用してこれらのケースでより高速と思われる回避策を思いつきましたがWhere(cond).Select(q => true).FirstOrDefault()
、これが単なる見落としなのか、それとも私が見逃している意味があるのか にまだ興味があります。
context.Books.Any(b => b.Id == bookId);
declare @p__linq__0 Int = 1;
SELECT
CASE WHEN ( EXISTS (SELECT
1 AS [C1]
FROM [Books] AS [Extent1]
WHERE [Extent1].[ID] = @p__linq__0
)) THEN cast(1 as bit) WHEN ( NOT EXISTS (SELECT
1 AS [C1]
FROM [Books] AS [Extent2]
WHERE [Extent2].[ID] = @p__linq__0
)) THEN cast(0 as bit) END AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
context.Books.Where(b => b.ID == bookId).Select(b => true).FirstOrDefault();
declare @p__linq__0 Int = 1;
SELECT TOP (1)
cast(1 as bit) AS [C1]
FROM [Books] AS [Extent1]
WHERE [Extent1].[ID] = @p__linq__0