2013-06-25 4 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 

EDIT: Хорошо, я не совсем понимаю, что вы ищете , Я не знаю, можно ли запрашивать несколько раз в одном утверждении, но у меня есть одно решение, которое я только что пробовал, который работает. Это может быть не всякий вкус, но мне это очень нравится. (Жаль, что я знал, как отступы и междустрочный в блоках кода ?!)

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