2013-09-10 5 views
6

Dire che ho un IQueryable che restituirà un tipo di dati con una proprietà ID (colonna).Query Linq solo per le prime N righe per ogni ID univoco

voglio filtrare ulteriormente la mia domanda (Non voglio valutare la query) come segue:

Per ognuna unica ID dalla query principale, voglio Take(n), dove n è un po 'arbitraria numero.

Cioè, voglio conservare solo le prime n righe per ogni ID univoco.

posso ottenere le distinte ID 's ...

var ids = query.Select(q => q.ID).Distinct(); 

e posso Take(n) con il resto di loro, ma sto perplesso su come collegare i due:

query = query.<FOR EACH DISTINCT ID>.Take(n); 

La risposta accettata funziona, ma è lenta per un grande tavolo. Ho scritto this question come follow-up.

risposta

6

Si può fare in questo modo:

query = query.GroupBy(q => q.ID).SelectMany(g => g.Take(n)); 

Il GroupBy riunisce i record con identici ID s, consentendo loro di elaborare come gruppo; SelectMany prende ogni gruppo, limita il numero dei suoi membri a n e riporta i risultati in un unico elenco.