在LINQ中使用可空列测试不等式

时间:2012-07-12 09:24:40

标签: c# linq tsql

在LINQ中,可以安全地对可空列进行不等式测试而不必转换可空类型吗?

在T-SQL中,您必须使用ISNULL()。 但在LINQ中,我可以安全地做到吗?:

mytable.nullablecol != 1

2 个答案:

答案 0 :(得分:1)

是的,这样做是安全的。

编辑:鉴于您的评论,问题可能是null == -1的结果为null,而不是true(在SQL中)。所以你可以使用查询:

mytable.nullablecol != 1 || mytable.nullablecol == null

当你想要将可能为空的值进行比较时,会变得更加棘手。你必须明确地迎合这一点。例如:

int? x = GetId();
var query = from foo in bar
            where foo.X == x || (foo.X == null && x == null)
            select ...;

答案 1 :(得分:1)

编译时安全吗?是。

您可能不打算使用null比较过滤器行吗?是。它是由数据库的规则在数据库中完成的。

foo.X != -1

此代码不会为您提供null X.如果你想要那些,你可以像这样:

(foo.X ?? 0) != -1

(foo.HasValue ? foo : 0) != -1

关于“=”vs“是”查询翻译:

int? x = GetId();
var query = from foo in bar
  where foo.X == x
  select foo;
//LinqToSql examines the x 
 // you get an "is" comparison when x is null
 // you get an "=" comparison when x is not null

你可能遇到翻译问题是编译查询。编译的查询无法检查其参数并调整翻译。在这种情况下,您必须为每个案例创建一个编译查询(对一个可空参数的两个查询)并将您的参数指向正确的案例查询。