以下 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/