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 查询或 lambda 表达式?

预期结果:

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
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 回答
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 回答