在“选择查询”中对值进行分类

时间:2014-09-15 10:32:18

标签: vb.net linq

我想在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

1 个答案:

答案 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
                    }