具有可为空值的 lambda 表达式 - 始终为 false,因为 Guid 类型的值从不等于“null”

Posted

技术标签:

【中文标题】具有可为空值的 lambda 表达式 - 始终为 false,因为 Guid 类型的值从不等于“null”【英文标题】:lambda expression with nullable value - always false since the value of type Guid is never equal to 'null' 【发布时间】:2021-12-30 04:02:06 【问题描述】:
public class Car

    public int Id get; set;
    public Guid? OwnersId  get; set; 
    ...

我正在尝试根据条件获取所有汽车数据

List<Car> cars = await carsContext.Query(x=>x.Id== model.CarId && x.OwnersId.Value == null);

表达式的结果总是假的,因为 type 的值 Guid 永远不等于“Guid”类型的“null”?

【问题讨论】:

【参考方案1】:

Value 结构的Value 属性返回基础类型的值(在您的情况下为Guid),它不能是null。将 OwnersId 本身与 null 进行比较:

List<Car> cars = await carsContext
    .Query(x => x.Id == model.CarId && x.OwnersId == null);

另一种选择是检查HasValue 属性:

List<Car> cars = await carsContext
    .Query(x => x.Id == model.CarId && !x.OwnersId.HasValue);

虽然这是否会转化为有效的 SQL 取决于您使用的 ORM。

【讨论】:

我试过这个,但我得到的是空的结果集,虽然我在检查 db 时确定不是这种情况 @user1765862 生成的sql检查了吗? @user1765862 你用的是什么ORM,Query 方法是什么?【参考方案2】:

“值”属性永远不会为空。如果 OwnersId 为 null,则调用 .Value 将引发异常。您应该检查 HasValue。所以你可以这样做:

List<Car> cars = await carsContext.Query(x=>x.Id== model.CarId && !x.OwnersId.HasValue);

【讨论】:

以上是关于具有可为空值的 lambda 表达式 - 始终为 false,因为 Guid 类型的值从不等于“null”的主要内容,如果未能解决你的问题,请参考以下文章

我怎样才能坚持protobuf网可为空值的数组

WCF中可为空值类型的错误

可为空的对象必须具有一个值

可为空的对象必须具有一个值 是啥原因啊 求解 谢谢

如何使用 Scala 在 DataFrame 中添加新的可为空字符串列

access中查询出来值的为空,如何将空值改为0,具体表达式是啥,从啥地方输入表达式,多谢