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
})
Ответы
Ответ 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, ....