2

次のクエリがあります。

Dim query = From m In Me.DataWorkspace.Products_dbData.MaterialList _
            Where m.ProductModel = Me.lblMyModel _
            And ((m.MaterialID = MyParam) OrElse (m.MaterialID.Contains(MyParam))) _
            Select m _
            Order By m.SortNumber

私のデータの抜粋は次のようになります。

ProductModel        MaterialID           SortNumber
------------        -------------        ----------
111                 ABC_Material1        NULL
111                 Material1            0
111                 XYZ_Material1        0
111                 Material2_J          0
111                 Material2_K          1
111                 Material2_L          2

同じクエリを使用したいシナリオが 2 つあります。

シナリオ 1:

MyParam = "Material1"

望ましい結果:

query = "Material1"

m.MaterialID = MyParam一致したという意味でOrElse短絡的にm.MaterialID.Contains(MyParam)実行されません。

実結果:

query = "ABC_Material1", "Material1", "XYZ_Material1"

なんらかの理由で、Contains実行中です。

シナリオ 2:

MyParam = "Material2"

望ましい結果:

query = "Material2_J", "Material2_K", "Material2_L"

m.MaterialID = MyParam一致しなかったため、m.MaterialID.Contains(MyParam)代わりに実行されることを意味します。

実結果:

query = "Material2_J", "Material2_K", "Material2_L"

したがって、これは期待どおりに機能するようです。

質問:

これが期待どおりに機能しないのはなぜですか? 私は何を間違っていますか?私はOrElseオペレーターの機能を誤解していると確信していますが、私にとって意味のある説明を見つけることができないようです.

代替手段と回避策をいただければ幸いです。

4

2 に答える 2

1

あなたはOrElse正しく理解していますが、LINQ クエリの仕組みは理解していません。
条件は、前の行の結果に関係なく、すべての行に対して実行されます。

于 2012-08-29T13:41:04.780 に答える
1

m.MaterialID = MyParam が一致し、OrElse が短絡したため、 m.MaterialID.Contains(MyParam) が実行されないことを意味します。

その個々の値に対しては実行されませんが、他のエントリに対しては実行されます。

覚えておかなければならないことは、述語が結果に適用されるということです。完全一致が既に存在するかどうかは完全に見えず、後で述語を適用することには関係ありません。

余談ですが、文字列が「それ自体を含む」場合、述語は次と同等です。

Where m.ProductModel = Me.lblMyModel And m.MaterialID.Contains(MyParam)

1 つの完全一致クエリと、(結果が見つからない場合) 部分一致クエリの 2 つのクエリを実行する必要があるようです。

于 2012-08-29T13:38:22.400 に答える