2016-07-11 16 views
5

Tôi có bảng đơn giản sau đây với ID, ContactIdComment.Làm thế nào để chọn hồ sơ cuối cùng trong một điều khoản LINQ groupby

enter image description here

Tôi muốn chọn hồ sơ và GroupBy contactId. Tôi đã từng LINQ mở rộng phương pháp tuyên bố này:

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

Nó trả về kỷ lục 14. Làm cách nào để sử dụng LINQ để nhận số ContactID với số cao nhất ID? (Tức là trở 36)

Trả lời

11

Bạn có thể đặt bạn mục

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

Sử dụng OrderByDescending vào các mục trong nhóm:

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

Ngoài ra, không có nhu cầu cho FirstOrDefault khi lựa chọn một mục từ nhóm; một nhóm sẽ luôn có ít nhất một mục để bạn có thể sử dụng First() một cách an toàn.

1

OrderByDescending

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

là giải pháp tốt nhất của bạn

Nó đơn đặt hàng bởi giảm dần ID cao nhất, đó là khá rõ ràng từ tên.

3

lẽ chọn với Max thay vì OrderByDescending có thể dẫn đến việc cải thiện hiệu suất (Tôi không chắc chắn làm thế nào nó thực hiện bên trong nên nó cần phải được kiểm tra):

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)); 

Như tôi cho rằng nó có thể dẫn đến vào truy vấn sẽ mất MAX và sau đó thực hiện SELECT * FROM ... WHERE id IN ({max ids here}) có thể nhanh hơn đáng kể so với OrderByDescending.

Hãy sửa lỗi nếu tôi không đúng.

Các vấn đề liên quan