我在SQL db中有一个用户定义函数:db.GetMovements(cultureId)
。
当这样调用时,它会正确返回2个值:
var movements = db.GetMovements(cultureId);
当我在可空的布尔值.Where
上使用linq' Complete
时,它会返回零值 - 这是不正确的:
var movements = db.GetMovements(cultureId).Where(m => m.Complete != true).ToList();
但是,如果我将上述内容更改为:
var movements = db.Movements(cultureId).ToList();
movements = movements.Where(m => m.Complete != true).ToList();
然后它正确返回 1 值。
为什么在第一个实例中使用.Where
不会产生任何结果?
答案 0 :(得分:5)
用户定义的函数不是存储过程。它有很大的不同。它与带参数的视图一样,GetMovements
返回IQueryable
,因此Where
方法将转换为SQL代码。
如果Complete
的值为NULL
,则所有比较操作都将返回false。
NULL <> 1
返回false
https://technet.microsoft.com/en-us/library/ms191270(v=sql.105).aspx
db.Movements(cultureId).ToList();
将值显示为.net对象,Nullable<bool>
的工作方式不同:
null != true
返回true
我认为,您的代码应该是这样的:
var movements = db.GetMovements(cultureId).Where(m => m.Complete == null || m.Complete == false).ToList();