Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WHERE子句中的EF硬编码值快,字符串参数慢_C#_Entity Framework - Fatal编程技术网

C# WHERE子句中的EF硬编码值快,字符串参数慢

C# 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

当我在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 );
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
    列的表中添加索引。请注意,索引对更新和插入有性能影响,因此您应该对此进行测试
  • 禁用空检查,记住LINQ查询的行为类似于SQL,而不是C#。这可以通过设置来完成

  • 这可能与实体框架中的空比较设置有关

    在查询之前添加以下代码,以查看它是否有助于查询性能:

    context.ContextOptions.UseCSharpNullComparisonBehavior = false;
    

    你的代码看起来很奇怪。不应该是
    。其中(x=>x.SourceDealerID==参数)
    (或
    …==“00011222fff33q”)
    ?就像这样,我没有复制粘贴确切的代码。请忽略这一点,我需要了解性能差的原因。谢谢,目前我没有添加索引的权限,在WHERE子句中还有10个过滤器,所以这将是我们不想要的10个索引。如何在代码中应用2?@st_stefanov在继承
    DbContext
    的类的构造函数中,访问
    configuration
    属性并设置它返回的对象的
    UseDatabaseNullSemantics
    。请编辑您的答案,以便我可以标记它。谢谢:)