2012-10-19 32 views
8

Mục đích là sắp xếp danh sách của phụ huynh, và sau đó đứa trẻ (sẽ chỉ có một đứa trẻ).Thực hiện một phụ huynh sau đó sắp xếp trẻ em trong Linq

Example Set: 
ID ParentId Type Unit 
1 NULL Energy kJ 
2 1  Cal 
3 NULL Protein g 
4 NULL Fat, total g 
5 4  Saturated g 
6 NULL Carbohydrate g 
7 6  Sugars g 
8 NULL Dietary fibre g 
10 NULL Sodium mg 
11 NULL Potassium mg 

Vì vậy, ví dụ, nếu tôi sắp xếp theo Loại (thứ tự ABC) nó sẽ đưa ra

  1. Carbohydrate
  2. Đường (mẹ = 1.)
  3. Năng lượng
  4. Cal (cha mẹ = 4.)
  5. Chất béo, tổng số
  6. bão hòa (mẹ = 6.)
+1

khi bạn nói bởi cha mẹ và n bởi con, bạn có nghĩa là các ID? Hoặc bạn có nghĩa là bạn muốn xem P1, C1, P2, C2, P3, C3, v.v ...? Đó là một câu hỏi hay, nó chỉ là không rõ ràng chính xác những gì bạn muốn xem kết quả. Có lẽ một mẫu hiển thị kết quả bạn mong đợi? –

+0

@JamesMichaelHare Đã thêm thiết lập dự kiến ​​trong – ediblecode

+0

Tôi giả định từ dữ liệu của bạn, bạn được đảm bảo rằng id con không bao giờ lớn hơn id mẹ của nó? –

Trả lời

4

Hãy thử điều này:

return myData.Select(x => new { key = (x.Parent ?? x).Type, item = x}) 
      .OrderBy(x => x.key) 
      .ThenBy(x => x.item.Parent != null) 
      .Select(x => x.item); 
+0

Tính năng này hoạt động. Chỉ dành cho người dùng trong tương lai: nó phải là '.ThenBy (x => x.item.Parent == null)' – ediblecode

+0

Rất tiếc. Đã chỉnh sửa. Cảm ơn vì đã bắt được điều đó. – Bobson

+1

Ah yeah, điều này thực sự không hoạt động, nó chỉ dường như vì dữ liệu của tôi đã được theo thứ tự đúng. – ediblecode

1

Điều này có thể được thực hiện theo hai bước. Đầu tiên - xây dựng hệ thống phân cấp cha-con (và sắp xếp nó):

var query = from parent in data 
      where parent.ParentId == null 
      orderby parent.Type 
      join child in data on parent.ID equals child.ParentId into g 
      select new { Parent = parent, Children = g }; 

Thứ hai - tâng bốc phân cấp

var result = query.Flatten(x => x.Parent, x => x.Children); 

Đối tâng bốc tôi đã sử dụng phương pháp khuyến nông:

public static IEnumerable<TResult> Flatten<T, TResult>(
    this IEnumerable<T> sequence, 
    Func<T, TResult> parentSelector, 
    Func<T, IEnumerable<TResult>> childrenSelector) 
{ 
    foreach (var element in sequence) 
    { 
     yield return parentSelector(element); 

     foreach (var child in childrenSelector(element)) 
      yield return child; 
    } 
}  
0

này nên làm việc

var query = from p in context.Table 
      from c in context.Table.Where(x => p.ID == x.ParentId) 
            .DefaultIfEmpty() 
      let hasNoParent = c == null 
      orderby hasNoParent ? p.Type : c.Type, hasNoParent ? 0 : 1 
      select hasNoParent ? p.Type : c.Type; 
+0

Rõ ràng 'c' không tồn tại trong ngữ cảnh hiện tại – ediblecode

+0

@danrhul - Xin lỗi, nó phải là x.ParentId – Aducci

+0

Không hoạt động Tôi sợ, 6 null, tiếp theo là dữ liệu lặp ngẫu nhiên – ediblecode

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