StartsWith()
次の LINQ クエリは、述語を使用して行をフィルター処理します。
db.Pictures.Where(pic => pic.Filename.StartsWith(path)).Count();
これは、次の SQL に変換されます (SQL Server Profiler から)。
exec sp_executesql N'SELECT
[GroupBy1].[A1] AS [C1]
FROM ( SELECT
COUNT(1) AS [A1]
FROM [dbo].[Pictures] AS [Extent1]
WHERE [Extent1].[Filename] LIKE @p__linq__0 ESCAPE N''~''
) AS [GroupBy1]',N'@p__linq__0 nvarchar(4000)',@p__linq__0=N'10429\2\6\%'
Filename
列は VARCHAR(255) 型で、インデックスが付けられています。ただし、 N in のため、クエリはインデックスを使用しませんESCAPE N'~'
。
クエリ実行プランに次の警告が表示されます。
式 (CONVERT_IMPLICIT(NVARCHAR(255), [Extent1].[Filename], 0)) の型変換は、クエリ プランの選択で "CardinalityEstimate" に影響を与える可能性があります
N が削除されると、クエリは正常に実行されます (インデックスを使用します)。
この問題を解決するにはどうすればよいですか?
(明らかな解決策の 1 つは、列の型を NVARCHAR に変更することかもしれませんが、実際には Unicode データを格納する必要がないため、理想的ではないようです)