2016-07-11 101 views
5

Ho il seguente semplice tabella con ID, ContactId e Commento.Come selezionare ultimo record in una clausola di LINQ GroupBy

enter image description here

Voglio selezionare i record e GroupBy contactId. Ho usato questo metodo LINQ estensione dichiarazione:

Mains.GroupBy(l => l.ContactID) 
.Select(g => g.FirstOrDefault()) 
.ToList() 

Esso restituisce record di 1 e 4. Come posso utilizzare LINQ per ottenere lo ContactID con il massimo ID? (Vale a dire tornare 3 e 6)

risposta

11

È possibile ordinare gli articoli

Mains.GroupBy(l => l.ContactID) 
.Select(g=>g.OrderByDescending(c=>c.ID).FirstOrDefault()) 
.ToList() 
5

Utilizzare OrderByDescending sugli articoli di questa categoria:

Mains.GroupBy(l => l.ContactID) 
    .Select(g => g.OrderByDescending(l => l.ID).First()) 
    .ToList(); 

Inoltre, non v'è alcuna necessità di FirstOrDefault nella scelta di un oggetto dal gruppo; un gruppo avrà sempre almeno un elemento in modo da poter utilizzare First() in modo sicuro.

1

OrderByDescending

Mains.GroupBy(l => l.ContactID) 
.Select(g=>g.OrderByDescending(c=>c.ID).FirstOrDefault()) 
.ToList() 

è la vostra migliore soluzione

ordina dalle più alte discendente ID, che è abbastanza evidente dal nome.

3

Forse selezione con Max invece di OrderByDescending potrebbe risultare in miglioramento di prestazione (non sono sicuro di come è fatto dentro quindi ha bisogno di essere testato):

var grouped = Mains.GroupBy(l => l.ContactID); 
var ids = grouped.Select(g => g.Max(x => x.Id)); 
var result = grouped.Where(g => ids.Contains(g.Id)); 

Come suppongo che potrebbe tradursi in una query che richiederà MAX e quindi fare SELECT * FROM ... WHERE id IN ({max ids here}) che potrebbe essere significativamente più veloce di OrderByDescending.

Sentitevi liberi di correggermi se non ho ragione.