Подтвердить что ты не робот

Linq Group на нескольких полях - VB.NET, анонимный, ключ

Я в тупике. Мне нужна помощь. У меня есть объект 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
                                                    })
4b9b3361

Ответ 1

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

Измените свою группировку, указав префикс 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
}

Ответ 2

Я нашел следующий код для работы, который по существу выполняет желаемую группировку и заполняет новый объект как тип 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

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

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