Entity framework 实体框架为什么要构建非SARgable谓词

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

我们正在使用实体框架6.1.1和代码优先和DbContext

以一个简单的查询为例:

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说明符的情况下生成参数,我们将得到一个索引搜索

  • 这是虫子吗?在代码优先映射中,字段映射为Unicode(false)

  • 是否有一种全局方法来配置它,而不必在对数据库中的char或varchar字段执行的每个查询中使用Dbfunction


  • 您可以在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号星期五,快下班了。