C#Linq SQL用户定义函数的位置

时间:2018-03-28 03:07:00

标签: c# linq

我在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不会产生任何结果?

1 个答案:

答案 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();