2012-10-19 83 views
8

打算按父級對子級進行排序,然後子級(只有一個子級)。在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 

因此,例如,如果我排序類型(按字母順序),將想出

  1. 碳水化合物
  2. 糖(父= 1)
  3. 膳食纖維
  4. 能源
  5. Cal(親本= 4.)
  6. 脂肪總計
  7. 飽和(父= 6)
+1

當你說由父母和ñ按小孩,你的意思是身份證?或者你的意思是你想看P1,C1,P2,C2,P3,C3等...?這是一個很好的問題,只是不清楚你希望看到什麼結果。也許是一個展示你期望的結果的樣本? –

+0

@JamesMichaelHare在 – ediblecode

+0

中添加了預期設置我會從您的數據中假設您保證兒童ID永遠不會超過其父母ID? –

回答

4

嘗試這種情況:

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

這工作。只爲未來的用戶:它應該是'.ThenBy(x => x.item.Parent == null)' – ediblecode

+0

糟糕。編輯。感謝您的支持。 – Bobson

+1

嗯,這實際上不起作用,它似乎是因爲我的數據已經按照正確的順序。 – ediblecode

1

這可以在兩個步驟來完成。首先 - 構建父子層次(和排序的話):

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

二 - 拍馬屁層次

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

對於奉承我使用的擴展方法:

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

這應該工作

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

顯然'c'在當前上下文中不存在 – ediblecode

+0

@danrhul - 對不起,應該是x。ParentId – Aducci

+0

沒有工作恐怕,6個空值,隨後是隨機重複數據 – ediblecode

相關問題