2012-01-26 6 views
0

私は構造体(aryShooters())の配列を持っています。彼らがどの投稿にいるのか、そして彼らが活動しているのかを判断する必要があります。彼らがそうであれば、私は彼らがどこにいたかを保存したい。ポストが塗りつぶされていない場合、配列内のその地点のインデックスは-1に設定されます。私が抱えている問題は、私がAndAlsoを使ってチェックしたところで、残りの行を短絡していないということです。また、Linqクエリvb.netで動作していません

Dim p1i as integer = -1 
Dim p1i as integer = -1 
Dim p1i as integer = -1 
Dim p1i as integer = -1 
Dim p1i as integer = -1 
For j as integer = 0 to UBound(aryShooters) 
    If aryShooters(j).active = true Then 
     Select Case aryShooters(j).post 
      Case 1 
       p1i = j 
      Case 2 
       p2i = j 
      Case 3 
       p3i = j 
      Case 4 
       p4i = j 
      Case 5 
       p5i = j 
     End Select 
    End If 
Next 

その直後、私は私のクエリを呼び出す:私はインデックスを設定するのはここ

です。これを妨害しているのは最後の5行だけです。

Dim pos 
pos = From p In db.Banks 
      Where p.ShootId = shootIdProp And p.EventId = eventNo _ 
      And ((p.FlightNo >= (CurFlight - kd)) And (p.FlightNo <= (CurFlight + (x-1) + ku))) _ 
      And ((p.SectionNo Like lowsec) Or (p.SectionNo like upsec)) _ 
      And p.Inactive = False And (((p.P1 like p1a And p.P2 Like p2a And p.P3 Like p3a And p.P4 Like p4a And p.P5 Like p5a) And resetFlags = False) _ 
      Or ((p.NmbrOpenPosts >= numberShooters) And resetflags = True)) _ 
      And ((((p1i > -1) AndAlso ((Math.Abs(aryShooter(p1i).Ydg - p.HcpYds1) <= perTrap) Or (p.HcpYds1 = 0.0))) And _ 
      (((p2i > -1) AndAlso ((Math.Abs(aryShooter(p2i).Ydg - p.HcpYds2) <= perTrap) Or (p.HcpYds2 = 0.0))) And _ 
      (((p3i > -1) AndAlso ((Math.Abs(aryShooter(p3i).Ydg - p.HcpYds3) <= perTrap) Or (p.HcpYds3 = 0.0))) And _ 
      (((p4i > -1) AndAlso ((Math.Abs(aryShooter(p4i).Ydg - p.HcpYds4) <= perTrap) Or (p.HcpYds4 = 0.0))) And _ 
      (((p5i > -1) AndAlso ((Math.Abs(aryShooter(p5i).Ydg - p.HcpYds5) <= perTrap) Or (p.HcpYds5 = 0.0)))) 
      Select p 

編集 - さて、私はそれを修正しました。 0の位置にブランクのスポットを追加しました。まだ参照できますが、実際にはそれを読み取ることはできません。

+0

は、なぜあなたはすべてでここにビット演算子を使用していますか? – Magnus

+0

@ Magnus、できるだけ効率的に多くの基準を持つクエリを選択することを他にどのように示唆しますか?各ループのif文が、テーブルをソートするためのLinq/Sqlで実行するよりも効率的ではないという条件で、条件を実行しないでしょうか? –

+0

ここではどこにでも 'AndAlso'と' OrElse'を使ってはいけないのですか? – Magnus

答えて

0

多分これは、(私はVBの専門家ではないです)に役立ちます。
私はライン思う:

pos = From p In db.Banks 

は、このようにする必要があります:

pos = From p In db.Banks _ 

私はラインだと思います:

Or (p.HcpYds5 = 0.0)))) 
      Select p 

Or (p.HcpYds5 = 0.0))) _ 
      Select p 

最後のif文には、使用されていない括弧がたくさんあります。

And ((((p1i > -1) AndAlso ((Math.Abs(aryShooter(p1i).Ydg - p.HcpYds1) <= perTrap) Or (p.HcpYds1 = 0.0))) And _ 
      (((p2i > -1) AndAlso ((Math.Abs(aryShooter(p2i).Ydg - p.HcpYds2) <= perTrap) Or (p.HcpYds2 = 0.0))) And _ 
      (((p3i > -1) AndAlso ((Math.Abs(aryShooter(p3i).Ydg - p.HcpYds3) <= perTrap) Or (p.HcpYds3 = 0.0))) And _ 
      (((p4i > -1) AndAlso ((Math.Abs(aryShooter(p4i).Ydg - p.HcpYds4) <= perTrap) Or (p.HcpYds4 = 0.0))) And _ 
      (((p5i > -1) AndAlso ((Math.Abs(aryShooter(p5i).Ydg - p.HcpYds5) <= perTrap) Or (p.HcpYds5 = 0.0)))) 
      Select p 

は、このようにする必要があります:私は声明だと思うそこのため

And _ 
      ((p1i > -1) AndAlso ((Math.Abs(aryShooter(p1i).Ydg - p.HcpYds1) <= perTrap) Or (p.HcpYds1 = 0.0))) And _ 
      ((p2i > -1) AndAlso ((Math.Abs(aryShooter(p2i).Ydg - p.HcpYds2) <= perTrap) Or (p.HcpYds2 = 0.0))) And _ 
      ((p3i > -1) AndAlso ((Math.Abs(aryShooter(p3i).Ydg - p.HcpYds3) <= perTrap) Or (p.HcpYds3 = 0.0))) And _ 
      ((p4i > -1) AndAlso ((Math.Abs(aryShooter(p4i).Ydg - p.HcpYds4) <= perTrap) Or (p.HcpYds4 = 0.0))) And _ 
      ((p5i > -1) AndAlso ((Math.Abs(aryShooter(p5i).Ydg - p.HcpYds5) <= perTrap) Or (p.HcpYds5 = 0.0))) _ 
      Select p 
+0

使用されていないようだが実際に&の&をグループ化するために使用されている括弧がたくさんあります。最後の "if"ステートメントはとの後にあり、それらのすべてがtrueを返し、それがTrueの場合です。私は私の他の質問を私からは持っていませんが、それらはすべて上記の私の元のコードと同じようにすべきです。私は彼らが他のクエリに似ていることを確認するためにチェックします。しかし、私のコードと別の参照メソッドでAndAlsoを使用していなかったとき、以前はコードが機能していました。この以前のメソッドは、新しい構造体の配列に組み込まれました。 –

+0

また、元のコンテキストで投稿された構文は、動作する他のクエリに似ている限り正しいです。 –