VB.NET LINQ查询AndAlso和Or的位置

时间:2015-04-21 15:39:54

标签: vb.net linq

在VB.NET中,如果我正在执行如下所示的LINQ查询:

From a in entitity.name
Where a.id = id _
AndAlso a.date < currentDate _
AndAlso a.statusId = 1 Or a.statusId = 3
Select

在第4行,or子句是否会评估返回statusId为3的所有实体,还是仅返回符合其他条件并且statusId为1或3的实体?

如果该行已更改为

 AndAlso (a.statusId = 1 Or a.statusId = 3)

这会如何改变预期结果?

2 个答案:

答案 0 :(得分:3)

在VB.NET中,联合(And,AndAlso)运算符出现在包含析取(Or,OrElse)运算符之前。请参阅 Operator Precedence in Visual Basic

因此,只要a.statusId = 3为真,它就会返回true。

并添加括号

AndAlso (a.statusId = 1 Or a.statusId = 3)
因此

会改变行为

从:

return TRUE if (a.id = id AND a.date < currentDate AND a.statusId = 1) OR a.statusId = 3

为:

return TRUE if a.id = id AND a.date < currentDate AND (a.statusId = 1 OR a.statusId = 3)

答案 1 :(得分:1)

From a in entitity.name
Where a.id = id _
AndAlso a.date < currentDate _
AndAlso a.statusId = 1 Or a.statusId = 3
Select

等同于(注意下面添加括号):

From a in entitity.name
Where (a.id = id _
AndAlso a.date < currentDate _
AndAlso a.statusId = 1) Or (a.statusId = 3)
Select

哪个会返回id匹配的结果,日期小于currentDate,状态为1.它还会返回statusId为3的任何结果。

获得:

From a in entitity.name
Where a.id = id _
AndAlso a.date < currentDate _
AndAlso (a.statusId = 1 Or a.statusId = 3)
Select

然后返回id匹配的任何结果,日期小于currentDate,状态为1或3。

这与您在SQL中看到的行为类型相同,甚至在一般数学中也是如此。 1 + 2 * 3(1 + 2) * 3的结果不同。它完全改变了操作的顺序/语句的含义(至少在这种情况下)。