Entity framework 实体框架为什么要构建非SARgable谓词
我们正在使用实体框架6.1.1和代码优先和DbContext 以一个简单的查询为例:Entity framework 实体框架为什么要构建非SARgable谓词,entity-framework,entity-framework-6,Entity Framework,Entity Framework 6,我们正在使用实体框架6.1.1和代码优先和DbContext 以一个简单的查询为例: Properties.Where(p => p.PropertyID == "aPRoperty") 生成并执行的SQL查询是: WHERE N'aPRoperty' = [Extent1].[PropertyID] 但是,数据库中的propertyID是varchar(10)。因此,上面的谓词执行索引扫描,而不是索引查找。这是由于谓词中的数据类型不同造成的 我可以使用以下命令强制执行正确的查询: P
Properties.Where(p => p.PropertyID == "aPRoperty")
生成并执行的SQL查询是:
WHERE N'aPRoperty' = [Extent1].[PropertyID]
但是,数据库中的propertyID是varchar(10)。因此,上面的谓词执行索引扫描,而不是索引查找。这是由于谓词中的数据类型不同造成的
我可以使用以下命令强制执行正确的查询:
Properties.Where(p => p.PropertyID == DbFunctions.AsNonUnicode("aPRoperty"))
这将在不使用N unicode说明符的情况下生成参数,我们将得到一个索引搜索
您可以在OnModelCreating事件中将所有字符串全局映射到varchar
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Properties<string>().Configure(c => c.IsUnicode(false));
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Properties().Configure(c=>c.IsUnicode(false));
}
对于所有的错误警报,我深表歉意。在我重建模型dll并将其重新加载到linqpad中之后,它似乎工作正常
我向EF团队表示歉意,在那里骂了你几分钟。当我将属性映射为IsUnicode(false)时,我在查询中没有看到unicode搜索字符串。@GertArnold是的,这里的另一个开发人员看到它工作正常。我重建了我的模型dll并重新加载linqpad,现在看来它是正确的。我不确定到底发生了什么。大多数存在此问题的数据库都是混合的。属性映射为
IsUnicode(false)
。并不是说所有的字符串属性都应该是非unicode的。谢谢@neil知道这一点很好,但这并不是我想问的。看来我快疯了,现在是13号星期五,快下班了。