3

以下 LINQ 查询使用StartsWith()谓词过滤行:

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 后,查询运行良好(使用索引)。

我该如何解决这个问题?

(一个明显的解决方案可能是将列的类型更改为 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 回答