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を指定し、この列のP.valueColは1、2、または3のみにすることができます。

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。たとえば、 MSSQLのトピックに関するMSDNページを参照してください。

あなたの場合、これはを含む条件がAND最初にチェックされることを意味します:

P.number = searchInput And P.valueCol = 2

次のORセクションをチェックする前に。

于 2012-09-07T08:28:36.940 に答える