2012-04-03 10 views
13

Jestem zaskoczony. Potrzebuję pomocy. Mam obiekt DTO z duplikatami danych adresowych pacjenta. Muszę uzyskać tylko unikalne adresy.Grupa Linq na wielu polach - VB.NET, Anonim, klucz

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() 

Próbowałem następujących bez powodzenia:

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  

a także

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

Masz rację w swoim komentarzu, usunę moją odpowiedź, ponieważ nie była pomocna. – daniloquio

+1

Czy próbowałeś wybrać tylko te pola, które chcesz sprawdzić, a następnie użyć .Distinct() na wyniku? –

+0

Mikey, tak, mam. Zmieniłem mój komentarz powyżej, aby uwzględnić kilka alternatyw. – wavedrop

Odpowiedz

19

Można użyć anonymous type i skorzystać z Key keyword w celu równości zachowywać się zgodnie z oczekiwaniami (nie wymagane dla C#).

Zmiana grupowania określając prefiks Key i wyjąć PatientAddress Zastosowanie:

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

Dziękuję za napiwek. Występuje błąd, ale stwierdzam, że inicjowana nazwa lub właściwość musi zaczynać się od ".". – wavedrop

+1

zaktualizowano @wavedrop. Musisz usunąć 'PatientAddress' w deklaracji" Nowy "podczas grupowania, aby użyć anonimowego typu. –

+0

To nie jest anonimowy typ. Typ to "Adres pacjenta" – wavedrop

2

jego prawdopodobnie dlatego PatientAddress nie zastępują GetHashCode i Equals. Alternatywą jest dla nas anonymous type dla grupowania. Spróbuj napisać:

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

czy masz jakieś zalecenie? – wavedrop

+0

Zaktualizowałem odpowiedź. Spróbuj użyć anonimowego typu zamiast istniejącej klasy. – Magnus

+0

Dziękuję, że pracowałeś i był bardzo pomocny. Jako odpowiedź wybrałem Ahmads, ponieważ mogłem wybrać tylko jeden, był nieco bardziej pomocny i myślę, że najpierw otrzymał ostateczną odpowiedź (przed edycją). Dzięki jeszcze raz. – wavedrop

3

Znalazłem następujący kod do pracy, która zasadniczo realizuje grupowanie, że pragnienie i wypełniania nowego obiektu jako typ PatientAddress dlatego wyeliminowanie użycia anonimowych obiektów i słowa kluczowego Klucz.

Może ktoś może to wyjaśnić, w tej chwili nie mogę. Miłego dnia.

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()