2013-09-10 54 views
6

Giả sử tôi có một IQueryable sẽ trả về kiểu dữ liệu với thuộc tính ID (cột).Truy vấn LINQ chỉ cho N hàng đầu tiên cho mỗi ID duy nhất

Tôi muốn lọc thêm truy vấn của tôi (Tôi không muốn đánh giá các truy vấn) như sau:

Đối với mỗi độc đáo ID từ truy vấn chính, tôi muốn Take(n), nơi n là một số tùy ý con số.

Tức là, tôi chỉ muốn giữ n hàng đầu tiên cho mỗi ID duy nhất.

tôi có thể nhận được rõ rệt ID 's ...

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

và tôi có thể Take(n) với phần còn lại của họ, nhưng tôi đang bối rối về kết nối hai:

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

Câu trả lời được chấp nhận hoạt động, nhưng chậm đối với một bảng lớn. Tôi đã viết this question để theo dõi.

Trả lời

6

Bạn có thể làm điều đó như thế này:

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

Các GroupBy tập hợp các hồ sơ với giống ID s, cho phép bạn xử lý chúng như một nhóm; SelectMany mất mỗi nhóm, giới hạn số lượng thành viên của nó thành n và đặt kết quả trở lại vào một danh sách phẳng.