在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)
这会如何改变预期结果?
答案 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
的结果不同。它完全改变了操作的顺序/语句的含义(至少在这种情况下)。