Vb.net 使用LINQ查询datatable.AsEnumerable

Vb.net 使用LINQ查询datatable.AsEnumerable,vb.net,linq,datatable,Vb.net,Linq,Datatable,我查询了一个数据表,以确定某一行是否存在,有几种可能的情况: 规则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:

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
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:

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
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
还有两个规则,如果我有一行返回给规则一,我使用从第一个查询返回的价格,如果没有从第一个查询返回任何东西,那么我转到第二个规则,使用第二个规则中的价格,如果需要,转到第三个和第四个规则

但这似乎有点冗长,我知道所有可能的场景,我想按什么顺序检查场景,有没有办法将这些结合起来,通过一个查询找出价格


谢谢

您的问题并不是100%清楚,但您似乎假设只有一行对应于任何给定参数,例如A1、B0等

在查询中,您使用any()来确定列表是否包含任何元素,然后尝试返回Single(),该函数仅在只有一个元素时有效,那么为什么要使用可枚举项呢

最好查找与您的条件相对应的第一项,并按您想要的顺序排列您的条件,例如

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  
编辑:好的,我没有完全明白你要找的东西。我不知道是否可以在一个语句中多次查询,但我有一个解决方案,我刚刚尝试过,它是有效的。可能不是每个人都喜欢,但我很喜欢。(但愿我知道如何在代码块中缩进和行距?!)


谢谢,single应该是FirstOrDefault,我已经编辑了这个问题,但是你的建议不起作用,因为可以同时存在多个场景,我只需要按顺序检查它们,如果有一行符合规则1,请使用该行,如果没有,请转到规则2等等。。