3

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 データを格納する必要がないため、理想的ではないようです)

4

1 に答える 1

5

モデルもvarcharに設定する必要があります。OnModelCreatingコンテキストでオーバーライドすることにより、これを構成できます。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Picture>().Property(p => p.Filename).IsUnicode(false);
}
于 2012-12-10T19:20:32.827 に答える