Vb.Net如何在If语句中的And中添加或

时间:2018-09-05 08:41:31

标签: vb.net

我通常是c#开发人员,但目前有一个VB.Net任务...

此If语句引起我一个问题

 If Emp("Id") = 20 AndAlso (Emp("EmpType") = 2 OrElse Emp("EmpType") = 4) AndAlso IsDBNUll(Emp("Left")) = True Then

所以我有个人加入了这个If语句,

  • Id = 20
  • EmpType = 2
  • 左=真

因为它们的Left在数据库中不为空,所以我不希望它们满足此If语句,但是它们满足。

我认为这与AndAlso周围的括号有关,但无法解决。

我在这里出了什么问题?

2 个答案:

答案 0 :(得分:0)

我认为是因为它的评估如下:

If 
    (Emp("Id") = 20 AndAlso (Emp("EmpType") = 2)
OrElse 
    (Emp("EmpType") = 4) AndAlso IsDBNUll(Emp("Left")) = True)
Then

您可以仅在前三个条件周围加上括号(假设如果EmpType为4,则您不希望ID等于20):

If (Emp("Id") = 20 AndAlso (Emp("EmpType") = 2 OrElse Emp("EmpType") = 4)) AndAlso IsDBNUll(Emp("Left")) = True Then

但是,我建议将其重构为多个if,以使其更具可读性...

If IsDBNUll(Emp("Left")) Then
    If (Emp("EmpType") = 4) OrElse _
       (Emp("EmpType") = 2 AndAlso Emp("Id") = 20) Then


    End if
End If

答案 1 :(得分:0)

让我重写条件以便于分析:

If Emp("Id") = 20 AndAlso (
       Emp("EmpType") = 2 OrElse 
       Emp("EmpType") = 4
   ) AndAlso 
   IsDBNUll(Emp("Left")) = True Then

您在这里有短路运算符,可能无法评估第二个表达式:

  1. OrElse中,如果满足第一个条件,则不计算第二个表达式。
  2. AndAlso中,如果不满足第一个条件,则不计算第二个表达式。

如果Left在db中不为空,则IsDBNUll(Emp("Left")) = True将求值为False,整个条件将失败。没有别的办法了。 如果先前的条件之一失败,它甚至可能不会执行。

因此,您有其他疑虑以外的问题。