2012-04-03 11 views
13

I am stumped. Ho bisogno di aiuto. Ho un oggetto DTO con dati di indirizzo paziente duplicati. Ho bisogno di ottenere solo gli indirizzi univoci.Gruppo Linq su più campi - VB.NET, Anonimo, Chiave

Dim PatientAddressDto = New List(Of PatientAddress) 

{Populate PatientAddressDto with lots of duplicate data} 

PatientAddressDto = (From d In PatientAddressDto 
        Group d By PatientAddressDtoGrouped = New PatientAddress With { 
                   .Address1 = d.Address1, 
                   .Address2 = d.Address2, 
                   .City = d.City, 
                   .State = d.State, 
                   .Zip = d.Zip 
                   } 
        Into Group 
        Select New PatientAddress With { 
                .Address1 = PatientAddressDtoGrouped.Address1, 
                .Address2 = PatientAddressDtoGrouped.Address2, 
                .City = PatientAddressDtoGrouped.City, 
                .State = PatientAddressDtoGrouped.State, 
                .Zip = PatientAddressDtoGrouped.Zip 
                }).ToList() 

Ho provato quanto segue senza fortuna:

PatientAddressDto = (From d In PatientAddressDto 
        Select New PatientAddress With { 
                .Address1 = d.Address1, 
                .Address2 = d.Address2, 
                .City = d.City, 
                .State = d.State, 
                .Zip = d.Zip 
                }).Distinct  

e anche

PatientAddressDto = PatientAddressDto.GroupBy(Function(p) New PatientAddress With { 
                .Address1 = p.Address1, 
                .Address2 = p.Address2, 
                .City = p.City, 
                .State = p.State, 
                .Zip = p.Zip 
                }) 
+0

Avevi ragione sul tuo commento, eliminerò la mia risposta poiché non è stata utile. – daniloquio

+1

Hai provato a selezionare solo i campi che vuoi controllare, quindi usare .Distinct() sul risultato? –

+0

Mikey, sì, ho. Ho modificato il mio commento sopra per includere alcune alternative. – wavedrop

risposta

19

È possibile utilizzare un anonymous type e fare uso della Key keyword in ordine per l'uguaglianza di comportarsi nel modo previsto (non richiesto per C#).

Cambia la tua raggruppamento specificando il prefisso Key e rimuovere il PatientAddress utilizzo:

Group d By PatientAddressDtoGrouped = New With { 
    Key .Address1 = d.Address1, 
    Key .Address2 = d.Address2, 
    Key .City = d.City, 
    Key .State = d.State, 
    Key .Zip = d.Zip 
} 
+0

Grazie per il suggerimento. Ricevo un errore, tuttavia, affermando che il nome o la proprietà da inizializzare deve iniziare con ".". – wavedrop

+1

@wavedrop aggiornato. È necessario rimuovere 'PatientAddress' nella dichiarazione' New' durante il raggruppamento in modo da utilizzare un tipo anonimo. –

+0

Non è un tipo anonimo. Il tipo è "Indirizzo paziente" – wavedrop

2

sua probabilmente perché PatientAddress non sovrascrive GetHashCode e Equals. Un'alternativa è a noi un anonymous type per il raggruppamento. Prova scritta:

Group d By PatientAddressDtoGrouped = New With { Key .Address1 = d.Address1, .... 
+0

hai una raccomandazione? – wavedrop

+0

Ho aggiornato la risposta. Prova a utilizzare un tipo anonimo anziché una classe esistente. – Magnus

+0

Grazie a te che ha funzionato ed è stato molto utile. Ho contrassegnato Ahmads come risposta perché potevo sceglierne solo uno, era leggermente più utile, e penso che abbia avuto la risposta definitiva prima (prima della modifica). Grazie ancora. – wavedrop

3

ho trovato il seguente codice di lavorare, che compie in sostanza, il raggruppamento che io desidero e popolare il nuovo oggetto come tipo PatientAddress pertanto eliminando l'uso di oggetti anonimi e la parola chiave Key.

Forse qualcuno può spiegarlo, al momento non posso. Buona giornata.

Dim PatientAddressDto = New List(Of PatientAddress) 

{Populate PatientAddressDto with lots of duplicate data} 

PatientAddressDto = (From d In PatientAddressDto 
        Group d By d.Address1, 
           d.Address2, 
           d.City, 
           d.State, 
           d.Zip Into g = 
        Group Let grp = New PatientAddress With {.Address1 = Address1, 
                   .Address2 = Address2, 
                   .City = City, 
                   .State = State, 
                   .Zip = Zip} 
        Select grp).ToList()