如果使用 null 进行检查,LINQ2SQL 不会返回行
本文关键字:返回 LINQ2SQL null 进行检查 如果 | 更新日期: 2023-09-27 18:32:41
我有以下LINQ2SQL查询:
var map =
dbContext.TCPDriverMappings.FirstOrDefault(
c => c.DriverFacilityId == tcpDms.FacilityId &&
c.DriverControlledParameterId == controlledParamId &&
c.DriverValue == value);
所有类型都是字符串。
在我的数据库中,我有一行,必须通过查询返回。
当value="0", controlledParamId =null and FacilityId ="abc"
这个查询返回 null,但是当我写以下内容时:
var test = dbContext.TCPDriverMappings.FirstOrDefault(
c => c.DriverFacilityId == "abc" &&
c.DriverControlledParameterId == null &&
c.DriverValue == "0");
测试未null
我做错了什么?
附言我也试过c.DriverControlledParameterId.Equals(controlledParamId)
但它也不起作用。
问题是,LINQ2SQL对表达式 c.DriverControlledParameterId == null
具有特殊的处理。它被转换为 SQL DriverControlledParameterId IS NULL
。
但是c.DriverControlledParameterId = controlledParamId
被翻译成SQL DriverControlledParameterId = :p1
,即使controlledParamId
是null
。在SQL中,DriverControlledParameterId = NULL
是未定义的,因此永远不会TRUE
。
解决方法:具体处理null
情况:
TCPDriverMapping test;
if(controlledParamId == null)
test = dbContext.TCPDriverMappings.FirstOrDefault(
c => c.DriverFacilityId == "abc" &&
c.DriverControlledParameterId == null &&
c.DriverValue == "0");
else
test = dbContext.TCPDriverMappings.FirstOrDefault(
c => c.DriverFacilityId == "abc" &&
c.DriverControlledParameterId == controlledParamId &&
c.DriverValue == "0");
或者像这样:
var test = dbContext.TCPDriverMappings.FirstOrDefault(
c => c.DriverFacilityId == "abc" &&
((controlledParamId == null &&
c.DriverControlledParameterId == null) ||
c.DriverControlledParameterId == controlledParamId) &&
c.DriverValue == "0");
或者像这样:
IQueryable<TCPDriverMapping> query =
dbContext.TCPDriverMappings.Where(c => c.DriverFacilityId == "abc" &&
c.DriverValue == "0");
if(controlledParamId == null)
query = query.Where(c => c.DriverControlledParameterId == null);
else
query = query.Where(c => c.DriverControlledParameterId == controlledParamId);
var test = query.FirstOrDefault();
第三个选项是我会使用的。在我看来,这比选项 2 更具可读性,并且没有像第一个那样重复的代码。