Entity Framework Where子句中处理Null属性异常问题(SQL Server)
解决方案
针对EF6.0.1中可空数值类型查询时丢失Null条件的问题,可尝试以下几种方法:
方法1:使用DbFunctions.IsNull统一判断
利用EF6提供的DbFunctions.IsNull方法,将Null值替换为0后再判断是否等于0,同时匹配Age为Null或0的记录:
var query = _context.Student .Where(s => DbFunctions.IsNull(s.Age, 0) == 0) .AsNoTracking() .ToQueryString();
生成的SQL会包含ISNULL([i].[Age], 0.0) = 0.0,正确覆盖Null和0两种情况。
方法2:用Object.Equals显式判断Null
替换原有的== null为Object.Equals(s.Age, null),强制EF生成IS NULL的SQL条件:
var query = _context.Student .Where(s => Object.Equals(s.Age, null) || s.Age == 0) .AsNoTracking() .ToQueryString();
这种写法会让EF正确翻译出[i].[Age] IS NULL OR [i].[Age] = 0.0的条件。
方法3:通过Union合并两个查询
将Null和0的条件拆分为两个独立查询,用Union合并结果:
var nullQuery = _context.Student.Where(s => s.Age == null); var zeroQuery = _context.Student.Where(s => s.Age == 0); var query = nullQuery.Union(zeroQuery) .AsNoTracking() .ToQueryString();
生成的SQL会用UNION合并两个查询结果,同样能得到符合要求的记录。
问题原因
EF6.0.1在处理可空值类型的== null || == 0这类OR条件时,存在翻译逻辑的优化bug,错误地丢弃了Null判断的部分,需要通过上述显式写法规避该问题。
内容的提问来源于stack exchange,提问作者Matheus Reis
相关产品推荐
相关产品推荐

