在LINQ中,可以安全地对可空列进行不等式测试而不必转换可空类型吗?
在T-SQL中,您必须使用ISNULL()。 但在LINQ中,我可以安全地做到吗?:
mytable.nullablecol != 1
答案 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
你可能遇到翻译问题是编译查询。编译的查询无法检查其参数并调整翻译。在这种情况下,您必须为每个案例创建一个编译查询(对一个可空参数的两个查询)并将您的参数指向正确的案例查询。