具有可为空值的 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”的主要内容,如果未能解决你的问题,请参考以下文章