2013-09-10 15 views
6

Powiedz, że mam IQueryable, który zwróci typ danych o właściwości (kolumnie) ID.Zapytanie Linq dla tylko pierwszych N wierszy dla każdego unikalnego identyfikatora

Chcę dodatkowo filtrować moje zapytanie (nie chcę oceniać zapytania) w następujący sposób:

dla każdego unikalnego ID od głównego zapytania, chcę Take(n), gdzie n pewne arbitralne numer.

Oznacza to, że chcę zachować tylko pierwsze wiersze n dla każdego unikalnego identyfikatora.

można uzyskać różne ID „s ...

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

i mogę Take(n) z resztą, ale jestem zakłopotany na podłączenie dwóch:

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

Przyjęta odpowiedź działa, ale jest wolna dla dużego stołu. Napisałem this question jako kontynuację.

Odpowiedz

6

Można to zrobić tak:

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

GroupBy skupia rekordy z identycznymi ID s, co pozwala przetwarzać je jako grupę; SelectMany przyjmuje każdą grupę, ogranicza liczbę jej członków do n i umieszcza wyniki z powrotem na jednej płaskiej liście.

Powiązane problemy