2009-04-06 13 views
8

Tôi có một danh sách các dữ liệu như vậy:dẹt LINQ Nhóm truy vấn

ID AddressPurpose Address ... 
1 L 
1 P 
2 L 
2 P 
3 P 
3 L 
4 P 
4 L 
5 P 
6 L 

Tôi muốn để có thể lọc dữ liệu để cho mỗi số duy nhất nếu có một hàng P sau đó nó được trả lại người nào khác Hàng L được trả về. Vì vậy, các dữ liệu sẽ trông như thế này:

ID AddressPurpose Address ... 
1 P 
2 P 
3 P 
4 P 
5 P 
6 L 

Tại thời điểm này tôi có truy vấn này mà hoạt động tốt:

var query = from c in list 
      orderby c.AddressPurpose descending 
      group c by c.ID 
      into g 
       select g; 

var finalList = new List<Company>(); 
foreach (var list in query) 
{ 
    finalList.Add(list.First()); 
} 
return finalList; 

Có cách nào tốt hơn để làm điều này mà không sử dụng foreach thêm?

Trả lời

3

Tại sao bạn không thay đổi selectg.First()?

+0

Bạn phải nhập khi tôi đang chỉnh sửa thư trả lời của chính tôi, lc! +1! –

+0

Tôi đoán vậy. Tôi cũng thích các truy vấn lồng nhau của bạn, chúng có thể sử dụng lại bất cứ lúc nào bạn cần lặp lại thông qua các truy vấn phức tạp. –

+0

Cảm ơn. Điều đó hoạt động rất tốt. Tôi giờ đã hiểu phần "thành g". –

10

Bạn có thể luôn luôn tổ truy vấn của bạn:

var query = 
    from i in (
     from c in list 
     orderby c.AddressPurpose descending 
     group c by c.ID into g 
     select g) 
    select i.First(); 

return query; 

Tôi chắc chắn đây không phải là cách duy nhất để làm điều đó (hoặc thậm chí có thể là tốt nhất), nhưng nó quấn "foreach" của bạn lên vào một truy vấn.

Sửa

Trong thực tế, bạn có thể đơn giản hóa này xuống:

var query = from c in list 
      orderby c.AddressPurpose descending 
      group c by c.ID into g 
      select g.First(); 

Đó dường như cho kết quả đúng.

2
var finalList = list 
    .GroupBy(c => c.ID) 
    .Select(g => g.OrderByDescending(c => c.AddressPurpose).First()) 
    .ToList();