2012-09-07 41 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