C# WHERE子句中的EF硬编码值快,字符串参数慢
当我在EF Where子句中设置字符串变量时,我的性能非常慢;当我在Where子句中硬编码字符串值时,性能非常快 C#,.Net Framework 4.7.1,EF 6.2 50msC# WHERE子句中的EF硬编码值快,字符串参数慢,c#,entity-framework,C#,Entity Framework,当我在EF Where子句中设置字符串变量时,我的性能非常慢;当我在Where子句中硬编码字符串值时,性能非常快 C#,.Net Framework 4.7.1,EF 6.2 50ms db.Dealers.Where(x => x.SourceDealerId == "000111222fff333q"); var parameter = "000111222fff333q"; db.Dealers.Where(x => x.SourceDealerId== parameter
db.Dealers.Where(x => x.SourceDealerId == "000111222fff333q");
var parameter = "000111222fff333q";
db.Dealers.Where(x => x.SourceDealerId== parameter );
1.5秒
db.Dealers.Where(x => x.SourceDealerId == "000111222fff333q");
var parameter = "000111222fff333q";
db.Dealers.Where(x => x.SourceDealerId== parameter );
dealerId在数据库中是Char(18)类型,并且可以为null。
方法是数据库优先。
以下是“经销商”列的属性:
在这两种情况下生成的SQL都有所不同。
对于fast案例:
…其中dealerId='00011222fff33q'
对于慢速情况:
如您所见,当您使用参数时,EF会添加一个空比较检查,以模拟C#中的空比较行为。在C#中,
null==null
为True,而在SQL中,null=null
为False。根据桌子的大小,这可能会影响性能
这里有两个选项:
SourceDealerID
列的表中添加索引。请注意,索引对更新和插入有性能影响,因此您应该对此进行测试这可能与实体框架中的空比较设置有关 在查询之前添加以下代码,以查看它是否有助于查询性能:
context.ContextOptions.UseCSharpNullComparisonBehavior = false;
你的代码看起来很奇怪。不应该是
。其中(x=>x.SourceDealerID==参数)
(或…==“00011222fff33q”)
?就像这样,我没有复制粘贴确切的代码。请忽略这一点,我需要了解性能差的原因。谢谢,目前我没有添加索引的权限,在WHERE子句中还有10个过滤器,所以这将是我们不想要的10个索引。如何在代码中应用2?@st_stefanov在继承DbContext
的类的构造函数中,访问configuration
属性并设置它返回的对象的UseDatabaseNullSemantics
。请编辑您的答案,以便我可以标记它。谢谢:)