Linq Group By VB.Net 中的多个属性

Linq Group By multiple properties in VB.Net

我想使用 VB.Net 在列表中分组。看起来很简单,但我无法让它工作。我试过:

Dim groupedEmails = saEmails.GroupBy(Function(m) New With {m.Property1, m.Property2, m.Property3.SubProperty1})

我在 saEmails 中有 6 个项目,其中两个项目具有相同的 Property1、Property2 和 Property3。不幸的是,在运行时我仍然在 groupedEmails 中得到 6 个项目,即使我的分组应该将该计数减少到 5 个。

我试过没有 "New With" 的语句(它仍然可以编译)但结果是一样的。我也无法让 Linq to Entities ("From mail in saEmails...") 接受我对关键字 "Group" 的使用。我已经 Imported System.Linq。

我也很乐意使用 .ToLookup()。

实体类似于:

    Namespace Something
    <DataContract()>
    Public Class SAEmail

        <DataMember()>
        Public Property Property1 As Integer

        <DataMember()>
        Public Property Property2 As String

        <DataMember()>
        Public Property Property3 As Blah

        <DataMember()>
        Public Property Property4 As String

    Public Overrides Function Equals(obj As Object) As Boolean

        If obj Is Nothing OrElse Not Me.GetType() Is obj.GetType() Then
            Return False
        End If

        Dim email As SAEmail = CType(obj, SAEmail)
        Return Property1 = email.Property1 _
            AndAlso Property2 = email.Property2 _
            AndAlso Property1.SubProperty1 = email.Property3.SubProperty1

    End Function

    Public Overrides Function GetHashCode() As Integer
        Return CInt(CLng(Property1) Xor CLng(Property2) Xor CLng(Property3.SubProperty1))
    End Function

    End Class

    <DataContract()>
    Public Class Blah

        <DataMember()>
        Public Property SubProperty1 As Integer

        <DataMember()>
        Public Property SubProperty2 As String

    End Class
End Namespace

想法?

创建复合分组键如何?

Dim groupedEmails = saEmails.GroupBy(Function(m) String.Format("{0}:{1}:{2}", m.Property1, m.Property2, m.Property3.SubProperty1))

或者,在几周后发布 VB14 时使用内插字符串!:

Dim groupedEmails = saEmails.GroupBy(Function(m) $"{m.Property1}:{m.Property2}:{m.Property3.SubProperty1)}")