Vb.net 列中的Linq 3值选择
我在理解Linq方面有点困难。 在vb.net中使用以下linq:Vb.net 列中的Linq 3值选择,vb.net,linq,filter,Vb.net,Linq,Filter,我在理解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张唱片。。。所有这些
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.编号,并且该列只能有一个P.valueCol为1、2或3。
我怀疑这是一个优先问题。我不知道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)
尝试包括一些括号: 如果你用词来思考你的问题,你可能会说: 其中,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
更深入地说,这可以归结为逻辑运算符优先级。这是查询中逻辑运算符的考虑顺序。对此,一个相当正常的标准是首先考虑而不是,然后是和,然后是或。例如,请参见MS SQL主题中的
在您的情况下,这意味着首先检查包含和的条件:
p.number=searchInput和p.valueCol=2
在检查以下或部分之前。谢谢,它工作得很好。我不知道括号会在linq中被接受。给我一分钟,接受你的回答,我想它有时间限制。谢谢你回答我的问题,jon skeet,很快给了我答案,我在看到你的答案之前尝试了他的答案。