2012-02-10 12 views
5

Sto provando a visualizzare tali righe nel mio DataGrid, che condividono lo stesso valore di colonna.LINQ: selezione di righe duplicate in base al valore di colonna

Ad esempio, per le persone, che hanno lo stesso cognome, ho provato questo:

dataGrid.ItemsSource = _dataContext.Addresses.GroupBy(a => a.SurName).Where(grp => grp.Count() > 1).Select(grp => grp.Key); 

Questo funziona apparentemente, come il mio WPF DataGrid contiene righe dopo questo comando ... Alla fine si visualizza solo righe vuote, poiché nessuna colonna è riempita con un valore.

O ho provato questo con le persone, che hanno la stessa città:

dataGrid.ItemsSource = _dataContext.Addresses.GroupBy(a => a.City).Where(grp => grp.Count() > 1).Select(grp => grp.Key).Select(a => a); 

Esiste un modo corretto di fare questo?

+0

Non sono sicuro della domanda che viene posta. Per chiarire, il primo esempio di codice funziona, ma il secondo campione non lo fa? – Bryan

+0

Entrambi non funzionano, poiché il primo restituisce solo righe vuote (ma ne restituisce alcune, almeno ...), e il secondo non restituisce nulla – SeToY

+1

Ciò significa che nel database sono presenti più righe con valori vuoti per SurName ? Sembra che funzionino entrambi, semplicemente non restituendo i dati che ti aspetti. Sarebbe utile vedere le definizioni di classe per 'Address' e' Person' – Bryan

risposta

9

Si sta selezionando solo la chiave nel tuo esempio:

dataGrid.ItemsSource = _dataContext.Addresses.GroupBy(a => a.SurName).Where(grp => grp.Count() > 1).Select(grp => **grp.Key**); 

ciò che io presumo che si sta cercando di fare è quello di selezionare l'intera riga:

dataGrid.ItemsSource = _dataContext.Addresses.GroupBy(a => a.SurName).Where(grp => grp.Count() > 1).SelectMany(grp => grp.Select(r=>r)); 

Per confrontare nome e cognome:

dataGrid.ItemsSource = _dataContext.Addresses.GroupBy(a => new Tuple<String, String>(a.ForeName, a.SurName)).Where(grp => grp.Count() > 1).SelectMany(grp => grp.Select(r=>r)); 

EDIT: Per L2E, è possibile (credo) utilizzare i tipi anonimi:

dataGrid.ItemsSource = _dataContext.Addresses.GroupBy(a => new { a.ForeName, a.SurName }).Where(grp => grp.Count() > 1).SelectMany(grp => grp.Select(r=>r)); 

Quanto sopra potrebbe non essere corretto, non sicuro al 100%.

+0

Grazie, credo che funzioni ... Come dovrei modificare la query per non solo confrontare i SurNames, ma anche i ForeName? .GroupBy (a => a.ForeName, a.SurName) non funziona. – SeToY

+0

Vuoi dire "mostra le righe che corrispondono sul nome e il cognome"? Vedi la mia modifica. –

+0

Sì, le righe in cui FirstName e LastName sono uguali – SeToY

Problemi correlati