2013-06-25 83 views
1

我有我查詢,以確定是否一定行存在一個數據表,有幾個可能的方案:查詢datatable.AsEnumerable與LINQ

規則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個規則,如果我有一個規則,一個返回行,我用個e從第一個查詢返回的價格,如果第一個查詢沒有返回任何內容,那麼我繼續執行第二個規則,並使用第二個的價格,並在必要時使用第三個和第四個的價格...

但是,這看起來有點冗長,我知道所有可能的情況,以及我想要檢查場景的順序,有沒有什麼方法可以將這些結合起來,並通過一個查詢找出價格?

感謝

回答

2

這不是從你的問題100%清楚,但看來你是假設只會有對應任何給定的參數一個行如A1,B0等

在查詢你使用any()來確定列表是否包含任何元素,然後嘗試返回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 

編輯順序:好的,我並沒有獲得你在找什麼。我不知道是否可以在一個聲明中多次查詢,但我有一個解決方案,我只是嘗試哪些工作。這可能不是每個人的口味,但我非常喜歡它。 (希望我能知道如何縮進和代碼塊行空間?!)

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 
+0

感謝,單應該已經FirstOrDefault,我編輯的問題,但你的建議是行不通的,因爲可以在同一存在多個場景時間,我只需要依次檢查它們,如果有符合規則1使用的行,如果不移動到規則2等。 – 03Usr