1

特定の行が存在するかどうかを判断するためにクエリを実行するデータ テーブルがあります。いくつかのシナリオが考えられます。

ルール 1:

Dim rt1 As EnumerableRowCollection(Of Double) = From row In dtCh.AsEnumerable() _
Order By row.Field(Of Int64)("ID") Descending
Where (row.Field(Of String)("L_TYPE") = "A" _
And row.Field(Of Int16)("Customer_Type") = 1)
Select row.Field(Of Double)("Price")

If rt1.Any() Then
    return CType(rt1.FirstOrDefault(), Decimal)
End If

ルール 2:

Dim rt2 As EnumerableRowCollection(Of Double) = From row In dtCh.AsEnumerable() _
Order By row.Field(Of Int64)("ID") Descending
Where (row.Field(Of String)("L_TYPE") = "B" _
And row.Field(Of Int16)("Customer_Type") = 0)
Select row.Field(Of Double)("Price")

If rt2.Any() Then
    return CType(rt2.FirstOrDefault(), Decimal)
End If

さらに 2 つのルールがあります。ルール 1 に対して行が返された場合は、最初のクエリから返された価格を使用します。最初のクエリから何も返されなかった場合は、2 番目のルールに進み、必要に応じて 3 番目と 4 番目に進みます...

しかし、これは少し長い道のりのようです。考えられるすべてのシナリオを知っており、どの順序でシナリオを確認したかったのですか?これらを組み合わせて、1 つのクエリで価格を調べる方法はありますか?

ありがとう

4

1 に答える 1

2

あなたの質問から100%明確ではありませんが、A1、B0などの特定のパラメータに対応する行が1つしかないと想定しているようです.

クエリでは、リストに要素が含まれているかどうかを判断するために any() を使用してから、要素が 1 つしかない場合にのみ機能する Single() を返そうとしていますが、なぜ Enumerable を使用しているのですか?

あなたの状態に対応する最初のアイテムを探して、あなたの状態をあなたが望む順番に並べるのが良いでしょう.

dtCh.AsEnumerable().OrderBy(Function(Row) Row.Field(Of Int64)("ID")).First(Function(Row) _  
(Row.Field(Of String)("L_TYPE") = "A" And Row.Field(Of Int16)("Customer_Type") = 1) Or _

(Row.Field(Of String)("L_TYPE") = "B" And Row.Field(Of Int16)("Customer_Type") = 0)).Price  

編集:わかりました、あなたが探しているものを完全に取得できませんでした。1 つのステートメントで複数回クエリを実行できるかどうかはわかりませんが、試した解決策が 1 つあります。みんなの好みではないかもしれませんが、私はとても好きです。(コード ブロックでインデントと行間を空ける方法を知りたいですか?!)

Dim Query = dtCh.AsEnumerable().OrderBy(Function(x) x.Id)

Dim Conditions = 
{
    Function(Row) Row.Field(Of String)("L_TYPE") = "A" And _
    Row.Field(Of Int16)("Customer_Type") = 1,
    Function(Row) Row.Field(Of String)("L_TYPE") = "B" And _
    Row.Field(Of Int16)("Customer_Type") = 0
}.ToList()

For Each Condition In Conditions
    Dim Price = Query.FirstOrDefault(Condition)
    If Price IsNot Nothing
        Price.Price 'Get your price here.
        Exit For
    End If
Next
于 2013-06-26T07:58:01.680 に答える