You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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存在两个问题:

  1. OwnersId本身就是null时,访问Value属性会直接抛出InvalidOperationException(运行时错误);
  2. 即使没抛出异常,Guid是值类型,它的实例永远不可能等于null,所以这个条件永远为false,自然查不到任何数据。

内容的提问来源于stack exchange,提问作者user1765862

火山引擎 最新活动