1

我在理解 Linq 时遇到了一些麻烦。在 vb.net 中使用以下 linq:

    Dim qeurySearch = (From P In DB.table1
      Where P.number = searchInput And P.valueCol = 2 OrElse 
      P.valueCol= 3 OrElse P.valueCol = 4
      Select P.number , P.valueCol
      ).ToList

我从中得到的是 4 条记录……它们都不是 searchInput。因此,假设 searchinput 为“102”,同一张表中的 valueCol 的值为“1”。然后我期望它不起作用,它不会给我任何记录。但那是错误的。

发生的事情是它完全忽略了我在 WHERE 子句中的 searchInput 并给出了 P.valueCol = 4 记录。好像那个是唯一的 WHERE 子句。

有谁知道我如何以正确的方式过滤我的查询?通过给出 P.Number 并且该列只能具有 1,2 或 3 的 P.valueCol。

4

2 回答 2

2

我怀疑这是一个优先问题。我不知道 VB 优先规则,但我怀疑您的查询被视为:

Where P.number = (searchInput And P.valueCol = 2) OrElse 
                 P.valueCol= 3 OrElse P.valueCol = 4

我建议您将代码更改为:

Where P.number = searchInput AndAlso (P.valueCol = 2 OrElse 
                                      P.valueCol = 3 OrElse 
                                      P.valueCol = 4)
于 2012-09-07T08:27:48.040 回答
1

尝试包括一些括号:

如果您从单词的角度考虑您的查询,您可能会说:

其中 number 等于 searchinput 并且 valuecol 是 2,3 或 4 之一

这很好地说明了括号应该在哪里:

Dim qeurySearch = (From P In DB.table1
  Where P.number = searchInput 
  And (P.valueCol = 2 OrElse P.valueCol= 3 OrElse P.valueCol = 4)
  Select P.number , P.valueCol
  ).ToList

更深入地说,这归结为称为逻辑运算符优先级的东西。这是考虑查询中的逻辑运算符的顺序。一个相当正常的标准NOT是先考虑,然后AND再考虑OR。例如,请参阅有关 MS SQL 主题的MSDN 页面

在您的情况下,这意味着首先检查包含的条件AND

P.number = searchInput And P.valueCol = 2

在检查以下OR部分之前。

于 2012-09-07T08:28:36.940 回答