2013-02-02 19 views
10

Ho un'applicazione VB.NET e desidero eseguire il raggruppamento su più colonne.Gruppo LINQ Con più parametri

Classe Struttura:

Public Class Person 
    Public Property Name as String 
    Public Property City as String 
    Public Property Country as String 
End Class 

Dim oResult = PersonList _ 
       .GroupBy(Function(v) New With {v.City, v.Country}) _ 
       .Where(Function(grp) grp.Count > 1).ToList() 

ho più record persona che contiene il nome stesso della città & nome del paese. Ma sopra la query mi restituisce zero elementi. se sto usando solo una colonna Città o Paese, allora funziona bene.

Dim oResult = PersonList _ 
       .GroupBy(Function(v) v.City) _ 
       .Where(Function(grp) grp.Count > 1).ToList() 

Chiunque mi indica dove ho sbagliato con Raggruppa per query LINQ con più parametri.

risposta

18

Il problema è che solo le proprietà Key in tipi anonimi vengono utilizzate in uguaglianza e hashing in VB. (Tutti immobili a C# tipi anonimi sono effettivamente proprietà chiave.) Quindi è solo bisogno di modificare la tua ricerca per:

Dim oResult = PersonList _ 
       .GroupBy(Function(v) New With { Key v.City, Key v.Country}) _ 
       .Where(Function(grp) grp.Count > 1).ToList() 

vedere la documentazione per anonymous types in VB per maggiori dettagli.

+1

Grazie! Esso funziona magicamente. –

2
Dim q1 = (From p In Repository.Table 
          Group p By p.CreatedDate.Year, p.CreatedDate.Month Into Group 
          Select New With {.Year = Year, .Month = Month, .Count = Group.Count()}).ToList 

O

Dim q2 = (From p In Repository.Table 
          Group p By key = New With {.Year = p.CreatedDate.Year, .Month = p.CreatedDate.Month} Into Group 
          Select New With {.Year = key.Year, .Month = key.Month, .Count = Group.Count()}).ToList