2012-04-03 20 views
13

Tôi đang bối rối. Tôi cần giúp đỡ. Tôi có một đối tượng DTO với dữ liệu địa chỉ bệnh nhân trùng lặp. Tôi cần chỉ nhận được các địa chỉ duy nhất.Linq Group trên nhiều lĩnh vực - VB.NET, Anonymous, Key

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

Tôi đã thử những điều sau đây không có may mắn:

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  

và cũng

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

Bạn đã đúng với nhận xét của mình, tôi sẽ xóa câu trả lời vì nó không hữu ích. – daniloquio

+1

Bạn đã thử chỉ chọn các trường bạn muốn kiểm tra, sau đó sử dụng .Distinct() trên kết quả? –

+0

Mikey, vâng tôi có. Tôi đã chỉnh sửa bình luận của mình ở trên để bao gồm một số lựa chọn thay thế. – wavedrop

Trả lời

19

Bạn có thể sử dụng một anonymous type và tận dụng các Key keyword để cho sự bình đẳng để hành xử theo cách mà bạn mong đợi (không cần thiết cho C#).

Thay đổi nhóm của bạn bằng cách xác định tiền tố Key và loại bỏ các PatientAddress sử dụng:

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

Cảm ơn bạn đã biết mẹo. Tôi nhận được một lỗi tuy nhiên nói rằng tên hoặc tài sản được khởi tạo phải bắt đầu bằng '.'. Đã cập nhật – wavedrop

+1

@wavedrop. Bạn cần xóa 'PatientAddress' trong khai báo' New' của bạn trong khi nhóm để bạn sử dụng một kiểu ẩn danh. –

+0

Nó không phải là bất kỳ loại ẩn danh nào. Loại này là "Địa chỉ bệnh nhân" – wavedrop

2

của nó có lẽ vì PatientAddress không ghi đè GetHashCodeEquals. Một giải pháp thay thế cho chúng tôi là anonymous type để nhóm. Hãy thử viết:

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

bạn có đề xuất không? – wavedrop

+0

Tôi đã cập nhật câu trả lời. Hãy thử sử dụng một loại ẩn danh thay vì một lớp hiện có. – Magnus

+0

Cảm ơn bạn đã làm việc và rất hữu ích. Tôi đã đánh dấu Ahmads là câu trả lời bởi vì tôi chỉ có thể chọn một câu trả lời, nó hữu ích hơn một chút và tôi nghĩ rằng anh ấy có câu trả lời cuối cùng trước (trước khi bạn chỉnh sửa). Cảm ơn một lần nữa. – wavedrop

3

Tôi đã tìm thấy đoạn mã sau để làm việc mà về cơ bản hoàn thành các nhóm mà tôi mong muốn và Populating các đối tượng mới as type PatientAddress do đó loại bỏ việc sử dụng các đối tượng ẩn danh và Khóa từ khóa.

Có thể ai đó có thể giải thích, tại thời điểm này tôi không thể. Chúc một ngày tốt lành.

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() 
Các vấn đề liên quan