C# LINQ2SQL不';如果检查为null,则不返回行

C# LINQ2SQL不';如果检查为null,则不返回行,c#,sql,linq,linq-to-sql,C#,Sql,Linq,Linq To Sql,我有以下LINQ2SQL查询: var map = dbContext.TCPDriverMappings.FirstOrDefault( c => c.DriverFacilityId == tcpDms.FacilityId && c.DriverControlledParameterId == controlledParamId

我有以下LINQ2SQL查询:

var map =
                dbContext.TCPDriverMappings.FirstOrDefault(
                      c => c.DriverFacilityId == tcpDms.FacilityId &&
                                 c.DriverControlledParameterId == controlledParamId &&
                                 c.DriverValue == value);
所有类型都是字符串

在我的数据库中有一行,必须通过查询返回

value=“0”,controlledParamId=null,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
DriverControl参数ID为NULL

但是
c.DriverControlledParameterId=controlledParamId
被转换为SQL
DriverControlledParameterId=:p1
,即使
controlledParamId
null
。在SQL中,
drivercontrolled参数id=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();
或者像这样:

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();
IQueryable查询=
dbContext.TCPDriverMappings.Where(c=>c.DriverFacilityId==“abc”&&
c、 DriverValue==“0”);
如果(controlledParamId==null)
query=query.Where(c=>c.drivercontrolled参数id==null);
其他的
query=query.Where(c=>c.DriverControlledParameterId==controlledParamId);
var test=query.FirstOrDefault();

第三种选择是我将使用的。在我看来,这比选项2更具可读性,并且没有像第一个那样的重复代码。

检查通过LINQ查询生成的SQL查询。LinqToSql中的空值需要特殊处理。看到了吗,丹尼尔,非常感谢,我有了这个想法,你的代码工作得很好@不客气。请查看更新后的答案,以了解有关如何编写答案的更多选项。