EF6中Linq查询生成SQL语句多出不必要OR条件的问题咨询
问题原因分析
- 这段OR条件是Entity Framework 6默认的C#语义对齐逻辑生成的:
EF6默认关闭UseDatabaseNullSemantics配置项,会严格对齐C#的空值比较规则。C#中两个null值做相等比较返回true,但SQL中NULL = NULL的判断结果是UNKNOWN,不会被条件匹配。为了保证两种场景下逻辑一致,EF会自动补充OR (两端表达式同时为NULL)的判断逻辑。 - 你的代码存在可空类型使用不严谨的问题:
你直接调用可空字段Col2的Value属性,没有先判断HasValue,EF会把x.Col2.Value.Year的返回值识别为可空int类型,和右侧的常量2021比较时,就触发了上面的空值对齐逻辑。虽然当前场景下DATEPART(year, 2021) IS NULL永远为假,这段OR逻辑不会影响最终查询结果,但属于冗余生成的代码。
修复方案
方案1:修改Linq写法(推荐)
调整查询逻辑,先过滤Col2不为空的情况,避免触发空值比较对齐:
var myTable = _dbContext.MyTable.Where(x => x.Col2.HasValue && x.Col2.Value.Year == 2021).ToList();
这种写法同时兼容Linq to Entity和Linq to Object场景,避免本地查询时空值调用Value抛出异常。
方案2:全局修改EF配置
在DbContext构造函数中开启数据库空值语义,关闭C#语义对齐逻辑,后续所有查询都不会生成这类冗余空值判断:
public YourDbContext() { this.Configuration.UseDatabaseNullSemantics = true; }
内容的提问来源于stack exchange,提问作者Emrikol
相关产品推荐
相关产品推荐

