2012-09-07 46 views
1

我对理解Linq有点麻烦。 与在vb.net以下LINQ:Linq 3列值选择

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。

回答

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) 
+0

谢谢你,它工作完美。我不知道括号会在linq中被接受。 – deltu100

+0

给我一分钟,接受你的回答,我觉得有时间限制。 – deltu100

1

尝试包括一些括号:

如果在的话来讲想查询的你可能会说:

在哪里数等于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 page

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

P.number = searchInput And P.valueCol = 2

以下OR部分之前进行检查。

+1

谢谢你回答我的问题,乔恩斯威特,给了我很快回答,我在他见到你之前试过了他。 – deltu100