Lambda表达式含可空值查询问题:Guid类型值无法与null比较导致结果恒为false
如何正确查询
Guid?类型字段为null的Car实体? 我定义了如下Car实体类:
public class Car { public int Id {get; set;} public Guid? OwnersId { get; set; } ... }随后尝试通过以下Lambda表达式作为查询条件获取所有符合要求的车辆数据:
List<Car> cars = await carsContext.Query(x=>x.Id== model.CarId && x.OwnersId.Value == null);但发现该查询表达式的结果始终为false,经分析原因在于Guid类型的值永远无法与Guid?类型的null相等,请问如何正确实现该查询需求?
这个问题很典型,核心错误在于你错误地访问了可空类型的Value属性来和null比较,我给你两种简单有效的解决办法:
方法一:直接将可空字段与null比较
Guid?是可空值类型,它本身支持直接和null做比较,完全不需要通过Value属性。修改后的查询代码如下:
List<Car> cars = await carsContext.Query(x => x.Id == model.CarId && x.OwnersId == null);
当EF解析这个条件时,会自动生成WHERE OwnersId IS NULL的SQL语句,精准筛选出OwnersId为null的车辆记录。
方法二:利用可空类型的HasValue属性
可空类型自带HasValue属性,当该属性为false时,就表示这个可空类型的值是null。用这种方式写查询也能达到同样的效果:
List<Car> cars = await carsContext.Query(x => x.Id == model.CarId && !x.OwnersId.HasValue);
这种写法和直接比较null是等价的,EF会生成相同的SQL查询逻辑。
为什么原来的写法会失败?
你之前的代码x.OwnersId.Value == null存在两个问题:
- 当
OwnersId本身就是null时,访问Value属性会直接抛出InvalidOperationException(运行时错误); - 即使没抛出异常,
Guid是值类型,它的实例永远不可能等于null,所以这个条件永远为false,自然查不到任何数据。
内容的提问来源于stack exchange,提问作者user1765862




