2012-04-03 19 views
13

Estoy perplejo. Necesito ayuda. Tengo un objeto DTO con datos duplicados de dirección del paciente. Necesito obtener solo las direcciones únicas.Grupo de líneas múltiples en campos múltiples - VB.NET, Anónimo, clave

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

he intentado lo siguiente sin suerte:

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  

y también

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

Has acertado en tu comentario, borraré mi respuesta ya que no fue útil. – daniloquio

+1

¿Ha intentado seleccionar solo los campos que desea verificar y luego usa .Distinct() en el resultado? –

+0

Mikey, sí, tengo. Edité mi comentario anterior para incluir algunas alternativas. – wavedrop

Respuesta

19

Puede utilizar un anonymous type y hacer uso de la Key keyword a fin de que la igualdad de comportarse de la forma esperada (no es necesario para C#).

Cambiar la agrupación especificando el prefijo Key y eliminar el uso 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 
} 
+0

Gracias por la sugerencia. Recibo un mensaje de error indicando que el nombre o la propiedad que se inicializa debe comenzar con '.'. – wavedrop

+1

@wavedrop updated. Debe eliminar 'PatientAddress' en su' Nueva' declaración mientras se agrupa para que use un tipo anónimo. –

+0

No es de ningún tipo anónimo. El tipo es "Dirección del paciente" – wavedrop

2

Su probablemente porque PatientAddress no anulan GetHashCode y Equals. Una alternativa es para nosotros un anonymous type para la agrupación. Trate de escribir:

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

¿tiene alguna recomendación? – wavedrop

+0

He actualizado la respuesta. Intente usar un tipo anónimo en lugar de una clase existente. – Magnus

+0

Gracias que funcionó y fue muy útil. Marqué a Ahmads como la respuesta porque solo pude elegir uno, fue un poco más útil, y creo que él tuvo la respuesta final primero (antes de su edición). Gracias de nuevo. – wavedrop

3

He encontrado el siguiente código al trabajo que lleva a cabo esencialmente la agrupación que yo quiero, y poblar el nuevo objeto de tipo PatientAddress por lo tanto, eliminando el uso de objetos anónimos y la palabra clave Key.

Quizás alguien pueda explicarlo, por el momento no puedo. Que tengas un buen día.

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