在 LINQ 中,对可空列执行不等式测试而无需转换可空类型是否安全?
在 T-SQL 中,您必须使用 ISNULL()。但是在 LINQ 中我可以安全地做吗?:
mytable.nullablecol != 1
编译时安全吗?是的。
空比较是否会过滤您可能不想要的行?是的。它是由数据库的规则在数据库中完成的。
foo.X != -1
此代码不会为您提供空 X。如果你想要那些,你可以像这样为空:
(foo.X ?? 0) != -1
或者
(foo.HasValue ? foo : 0) != -1
关于“=”与“是”查询翻译:
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
您可能会遇到翻译问题的地方是编译查询。已编译的查询无法检查其参数并调整翻译。在这种情况下,您必须为每个案例创建一个编译查询(一个可为空参数的两个查询)并将您的参数定向到正确案例的查询。
是的,这样做是安全的。
编辑:鉴于您的评论,问题可能是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 ...;