小编Mar*_*ark的帖子

为什么EF使用不必要的空值检查生成SQL查询?

我在搜索字符串字段时遇到了EF创建可怕查询的问题.它以懒惰程序员的风格产生了一个查询,包含空检查,强制扫描整个索引.

考虑以下查询.

  1. 查询1

    var p1 = "x";
    var r1 = ctx.Set<E>().FirstOrDefault(
                            subject =>
                                p1.Equals(subject.StringField));
    
    Run Code Online (Sandbox Code Playgroud)
  2. 查询2

    const string p2 = "x";
    var r2 = ctx.Set<E>().FirstOrDefault(
                            subject =>
                                p2.Equals(subject.StringField));
    
    Run Code Online (Sandbox Code Playgroud)

查询1生成

WHERE (('x' = [Extent2].[StringField]) OR (('x' IS NULL) AND ([Extent2].[StringField] IS NULL))) 
Run Code Online (Sandbox Code Playgroud)

并在4秒内执行

查询2生成

WHERE (N'x' = [Extent2].[StringField]) 
Run Code Online (Sandbox Code Playgroud)

并在2毫秒内执行

有谁知道任何工作?(没有参数不能是const,因为它是由用户输入输入的,但不能为null.)

NB在分析时,两个查询都是由EF用sp_executesql编写的; 因为如果它们刚被执行,查询优化器将否定OR'x'IS NULL检查.

为@Martin

c# sql-server entity-framework

47
推荐指数
2
解决办法
4682
查看次数

DBMS中规范化和分区的区别

数据库管理系统中使用的术语"规范化"和"分区"之间是否有任何区别?我尝试谷歌它,但用简单的话语找不到合适的答案.水平和垂直分区有什么区别?

database oracle rdbms database-normalization

0
推荐指数
1
解决办法
584
查看次数