我想在select linq查询中对值进行分类。如果您有很多类别,以下工作但非常混乱:
Dim query = From element In Ticket.GetTickets
Select New With {
.Code = If(element.Val <= 1, 1, If(element.Val <= 1.25 And element.Val > 1, 2, 0))}
所以我认为我为此目的编写了一个扩展方法
Module Categorization
<Extension()>
Public Sub Categorize(ByVal aValue As Double)
If aValue <= 1 Then
aValue = 1
ElseIf aValue > 1 And aValue <= 1.25 Then
aValue = 2
Else
aValue = 0
End If
End Sub
End Module
但是如果我尝试应用方法
Dim query = From element In Ticket.GetTickets
Select New With {
.Code = If(element.Val <= 1, 1, If(element.Val <= 1.25 And element.Val > 1, 2, 0)),
.Test = element.Val.Categorize
}
我总是得到编译错误:Expression has no value
(消息可能有点不同,我翻译了它)。任何可以帮助我使用这种扩展方法的人。我对任何更好的解决分类问题的想法持开放态度。
为了运行它,我想提供我用作示例的类:
Public Class Ticket
Public Property id As Integer
Public Property Val As Double
Public Shared Function GetTickets() As list(Of Ticket)
Return New List(Of Ticket) From {New Ticket With {.id = 1, .Val = 0.9867},
New Ticket With {.id = 2, .Val = 1.23},
New Ticket With {.id = 3, .Val = 1.5}}
End Function
End Class
答案 0 :(得分:0)
我解决了我的问题。
适合我的扩展方法是:
Public Module Categorization
<Extension()>
Public Function Categorize(ByVal val As Double) As UInt16
Dim reVal As UInt16
If val <= 1 Then
reVal = 1
ElseIf (1 <= val) AndAlso (val < 1.25) Then
reVal = 2
Else
reVal = 0
End If
Return reVal
End Function
End Module
现在我可以触发查询:
Dim query = From element In Ticket.GetTickets
Select New With {
.Code = If(element.Val <= 1, 1, If(element.Val <= 1.25 And element.Val > 1, 2, 0)),
.Test = element.Val.Categorize
}