1

データベースに次のようなメニュー項目のリストがあります。

ID      ParentID      ItemOrder      Name
-------------------------------------------------------    
 1       null               1        Main_1
 2       null               2        Main_2
 3       null               3        Main_3
 4       null               4        Main_4
 5       null               5        Main_5
 6       1                  4        SubMenu_1.4
 7       1                  5        SubMenu_1.5
 8       1                  8        SubMenu_1.8
 9       2                  1        SubMenu_2.1
10       3                  1        SubMenu_3.1
11       3                  2        SubMenu_3.2
12       3                  4        SubMenu_3.4

Submenu ItemOrder必ずしも 1 から始まるとは限らず、3 から始まる場合もあり、次のメニュー項目の順序は 7 などになる場合があります。

すべての親 (ゼロ レベル) メニュー項目と最初の子 (存在する場合) を返す linq クエリまたはラムダ式を作成する方法は?

期待される結果:

ID      ParentID      ItemOrder      Name
-------------------------------------------------    
 1       null             1          Main_1
 2       null             2          Main_2
 3       null             3          Main_3
 4       null             4          Main_4
 5       null             5          Main_5
 6       1                4          SubMenu_1.4
 9       2                1          SubMenu_2.1
10       3                1          SubMenu_3.1
4

3 に答える 3

1
var items = dbContext.Table
    .Where(item => item.ParentID == null)
    .Union(dbContext.Table
        .Where(x => x.ParentID != null)
        .GroupBy(x => x.ParentID)
        .Select(g => g.FirstOrDefault()));
于 2012-11-24T11:21:01.970 に答える
0

このクエリを使用します

    var parents = table.Where(i => i.ParentID == null);
    var immediateChildren = table
        .GroupBy(i => i.ParentID)
        .Select(g => g.OrderBy(i => i.ItemOrder).FirstOrDefault());
    var result = parents.Union(immediateChildren);

結果には、要求された直接の子のみが含まれ、変数は何が起こっているのかを理解するのに役立ちます。

于 2012-11-24T11:51:38.320 に答える
0
public IQueryable<MenuItem> MakeQuery()
{

    var parentsQuery =
        from parent in ctx.MenuItem
        where parent.ParentID == null
        orderby parent.ItemOrder
        select parent;

    var childrenQuery =
        from parent in parentsQuery
        join child in ctx.MenuItem
            on parent.ID equals child.ParentID
        where !ctx.MenuItem.Any(child2 => child2.ParentID == parent.ID
            && child2.ItemOrder < child.ItemOrder)
        orderby child.ItemOrder
        select child;

    return parentsQuery.Concat(childrenQuery);
}

これにより、「Union または Concat の型が互換性なく構築されています」というエラーが回避されます。LINQ から SQL に変換され、最初のレベルの子のみが返されます。

于 2012-11-24T11:34:00.873 に答える