sql-server - 使用 StartsWith 过滤时 EF 不使用 SQL 索引

标签 sql-server entity-framework ef-code-first

以下 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) 并且已编入索引。 但是,由于 ESCAPE N'~' 中的 N,查询不使用索引。

在查询执行计划中我可以看到一个警告:

Type conversion in expression (CONVERT_IMPLICIT(NVARCHAR(255), [Extent1].[Filename], 0)) may affect "CardinalityEstimate" in query plan choice

当删除 N 时,查询运行正常(使用索引)。

我该如何解决这个问题?

(一个明显的解决方案可能是将列的类型更改为 NVARCHAR,但这似乎并不理想,因为我实际上并不需要存储 unicode 数据)

最佳答案

您需要将模型设置为 varchar。您可以通过覆盖上下文中的 OnModelCreating 来配置它。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Picture>().Property(p => p.Filename).IsUnicode(false);
}

关于sql-server - 使用 StartsWith 过滤时 EF 不使用 SQL 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13795155/

相关文章:

asp.net-mvc - MVC 5代码的第一个用户ID作为外键

sql-server - SQL 中的二元运算符 OR?

SQL GROUP BY 一列的不同值

sql-server - 即使在备份日志到磁盘后,日志文件上的 DBCC SHRINKFILE 也不会减小大小

sql-server - 检查所有存储过程的语法?

c# - WCF 数据服务,不要公开所有列

forms - symfony2 表单中找不到实体错误

entity-framework - 一对多导航属性在代码第一个 EF5 中为 null

entity-framework - 代码优先引用一对多

c# - SaveChanges() 前新添加的 Entity 的 Id