C# 将空参数传递到LINQ where子句
我有一个表,其中一些项可能为空。然后,我可以使用如下查询轻松地进行查询:C# 将空参数传递到LINQ where子句,c#,linq,entity-framework,C#,Linq,Entity Framework,我有一个表,其中一些项可能为空。然后,我可以使用如下查询轻松地进行查询: db.SomeTable.Where(s => s.SomeCol == null) 很简单,但在使用正好为null的变量时,这不起作用(没有结果。我怀疑它正在搜索空字符串;“”),如下所示: string variable = null; db.SomeTable.Where(s => s.SomeCol == variable) 我必须做一些特殊的事情才能让它工作吗?使用LinqPad您可以看到区别 前
db.SomeTable.Where(s => s.SomeCol == null)
很简单,但在使用正好为null的变量时,这不起作用(没有结果。我怀疑它正在搜索空字符串;“”),如下所示:
string variable = null;
db.SomeTable.Where(s => s.SomeCol == variable)
我必须做一些特殊的事情才能让它工作吗?使用LinqPad您可以看到区别 前者创建的查询类似于:
select ...
from SomeTable as t0
where t0.SomeCol IS NULL
而后者是
select ...
from SomeTable as t0
where t0.SomeCol = @p0
相反,您可以在测试中使用object.Equals。例如:
string test = null;
var q = from c in SomeTable where object.Equals(c.SomeCol, test) select c;
这将根据条件中使用的变量值生成相应的where子句。使用LinqPad可以看到差异 前者创建的查询类似于:
select ...
from SomeTable as t0
where t0.SomeCol IS NULL
而后者是
select ...
from SomeTable as t0
where t0.SomeCol = @p0
相反,您可以在测试中使用object.Equals。例如:
string test = null;
var q = from c in SomeTable where object.Equals(c.SomeCol, test) select c;
这将根据条件中使用的变量值生成相应的where子句。SomeCol的类型是什么?“不工作”是什么意思?您得到的是编译器错误还是异常?这是Linq2Sql的EF吗?如果EF,哪个版本?@Heather,我想他需要使用DBNull.Value。(更具体地说)@Heather我认为这可能无法编译。SomeCol的类型是什么?“不工作”是什么意思?您得到的是编译器错误还是异常?这是Linq2Sql的EF吗?如果EF,哪个版本?@Heather,我想他需要使用DBNull.Value。(更具体地说)@Heather我认为这很可能无法编译。如果真是这样,那么LINQ到SQL(或EF)的抽象又是一个漏洞。非常遗憾的是,有这么多的情况,基本上使整个抽象都成了问题。如果真是这样,那么LINQ到SQL(或EF)的抽象又是一个漏洞。真的很遗憾,有这么多的案例,基本上使整个抽象都成了问题。