2012-05-17 30 views
36

Tôi có cấu trúc nàyLINQ Nhóm By và chọn bộ sưu tập

Customer 
- has many Orders 
    - has many OrderItems 

Tôi muốn tạo ra một danh sách các CustomerItems qua LINQ cung cấp một tập hợp con của OrderItems:

List of new { Customer, List<OrderItem> Items } 

mà là một nhóm của tất cả các các mục mà Khách hàng đã đặt hàng từ tập hợp con của các mục

Tôi có thể sử dụng LINQ để quay lại theo thứ tự và nhóm của Khách hàng để tạo đối tượng này như thế nào?

cho đến nay tôi đang trên một cái gì đó giống như

items 
.GroupBy(i => i, i => i.Order.Customer, (i, customer) => new {customer, i}) 

nhưng thats rõ ràng không phải là một danh sách. Tôi đoán tôi cần một SelectMany trong đó một nơi nào đó, nhưng có thể làm với một số gợi ý.

Trả lời

69

Tôi nghĩ rằng bạn muốn:

items.GroupBy(item => item.Order.Customer) 
    .Select(group => new { Customer = group.Key, Items = group.ToList() }) 
    .ToList() 

Nếu bạn muốn tiếp tục sử dụng sự quá tải của GroupBy bạn hiện đang sử dụng, bạn có thể làm:

items.GroupBy(item => item.Order.Customer, 
       (key, group) => new { Customer = key, Items = group.ToList() }) 
    .ToList() 

... nhưng cá nhân tôi thấy rằng chưa rõ ràng.

+0

làm bạn cần ToList() gọi vào nhóm? Liệu ToList cuối cùng() có đủ không? –

+0

@Ani - Có tôi phải đồng ý –

+2

@ Joanna: Theo yêu cầu của OP, thuộc tính 'Items' của loại ẩn danh phải là danh sách. – Ani

2

bạn có thể đạt được nó với nhóm tham gia

var result = (from c in Customers 
      join oi in OrderItems on c.Id equals oi.Order.Customer.Id into g 
      Select new { customer = c, orderItems = g}); 

c là khách hàng và g là khách hàng đặt mua các mặt hàng.

3

bạn cũng có thể như thế này

var Grp = Model.GroupBy(item => item.Order.Customer) 
     .Select(group => new 
     { 
      Customer = Model.First().Customer, 
      CustomerId= group.Key, 
      Orders= group.ToList() 
     }) 
     .ToList(); 
+0

Tại sao tôi lấy 'item.Field <>' và không '.Order' chẳng hạn? Tôi đang sử dụng một DataTable. – Si8

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