如果使用nullable int变量LINQ返回0结果,如果使用"null"则返回准确结果

Ian*_*vis 11 .net c# linq-to-entities linq-to-sql

我有一个名为"test"的表,它只有1列,"NullableInt"(可为空的int类型)

记录是:1,2,null

int? nullableInt = null;
var t = db.tests.Where(x => x.NullableInt == null).ToList(); // returns 1 record
var t2 = db.tests.Where(x => x.NullableInt == nullableInt).ToList(); // returns 0 records
Run Code Online (Sandbox Code Playgroud)

出于某种原因,t2返回0条记录,即使它使用"nullableInt"变量,其值为null,就像t,它与"null"进行比较

任何帮助将不胜感激!

Ada*_*kis 6

是的 - 这是LINQ-to-SQL/Entity Framework中的一个错误. IS NULL只有在将null硬编码到查询中时才会生成查询,而不是当前为null的变量.

第二个查询将生成

SELECT .......
WHERE NullableInt == @someParam
WHERE @someParam is null.
Run Code Online (Sandbox Code Playgroud)

其中第一个将IS NULLWHERE子句中生成相应的.

如果你正在使用LINQ-to-SQL,你可以将你的查询记录到Console.Out以便自己查看,如果你正在使用EF,那么ToTraceString()应该显示相同的信息(或SQL Server探查器)

  • 实际上我认为这不是一个bug,因为在第二个表达式`nullableInt`不是`null`,即使你用`nullableInt = null`赋值(因为它是一个结构,其值不能为null).因此,框架将其视为其他结构(例如int). (2认同)
  • @Danny,那是分裂的头发.错误可能在规范中,即使代码完全按照规范所说的那样做.换句话说,这里的错误可能不是代码碰巧做错了什么,而是有人没有考虑这种情况. (2认同)

Ale*_*hik 2

查询可以这样构建:

var q = db.tests;
if(nullableInt.HasValue)
{
   q = q.Where(x => x.NullableInt == nullableInt.Value);
}
else
{
   q = q.Where(x => x.NullableInt == null);
}
var t2 = q.ToList();
Run Code Online (Sandbox Code Playgroud)