为什么Entity Framework构建非SARgable谓词

时间:2015-02-13 21:30:09

标签: entity-framework entity-framework-6

我们正在使用Entity Framework 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说明符的参数,我们得到一个Index Seek。

  1. 这是一个错误吗?这些字段在代码优先映射中映射了IsUnicode(false)。

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

2 个答案:

答案 0 :(得分:0)

您可以在OnModelCreating事件中将所有字符串全局映射到varchar。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Properties<string>().Configure(c => c.IsUnicode(false));  
}

答案 1 :(得分:0)

对不起所有的误报。在重建我的模型dll并将其重新加载到linqpad后,它似乎正常工作。

我向EF团队致歉,诅咒你的名字几分钟。