8

目的は、リストを親、次に子で並べ替えることです(子は1つだけです)。

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

3 に答える 3

6

これを試して:

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);
于 2012-10-19T14:32:50.800 に答える
1

これは2つのステップで行うことができます。最初に-親子階層を構築する(そしてそれをソートする):

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

2番目-お世辞の階層

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;
    }
}    
于 2012-10-19T14:37:14.297 に答える
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;
于 2012-10-19T14:42:58.907 に答える