2

在 LINQ 中,对可空列执行不等式测试而无需转换可空类型是否安全?

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

mytable.nullablecol != 1
4

2 回答 2

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

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

于 2012-07-12T19:15:19.360 回答
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 ...;
于 2012-07-12T09:29:23.923 回答