Группа Linq на нескольких полях - VB.NET, анонимный, ключ - PullRequest
16 голосов
/ 03 апреля 2012

Я в тупике.Мне нужна помощь.У меня есть объект DTO с дубликатами данных адреса пациента.Мне нужно получить только уникальные адреса.

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

Я безуспешно пробовал следующее:

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     

, а также

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

Ответы [ 3 ]

23 голосов
/ 03 апреля 2012

Вы можете использовать анонимный тип и использовать ключевое слово Key , чтобы равенство могло вести себя так, как вы ожидаете (не требуется для C #).

Измените свою группировку, указав префикс Key и удалите использование PatientAddress:

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
}
4 голосов
/ 24 апреля 2012

Я нашел следующий код для работы, который, по сути, выполняет желаемую группировку и заполняет новый объект как тип PatientAddress, исключая тем самым использование анонимных объектов и ключевого слова Key.

Может быть, кто-то может это объяснить, на данный момент я не могу. Хорошего дня.

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()
3 голосов
/ 03 апреля 2012

Вероятно, потому что PatientAddress не переопределяет GetHashCode и Equals. Альтернатива для нас - анонимный тип для группировки. Попробуйте написать:

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