LINQ to SQL,按相关表排序

时间:2009-12-01 21:26:04

标签: linq

我正在尝试使用LINQ to SQL在相关表格中对值进行排序。

我有2张桌子。菜单和MenuSection。它们在Menu.MenuId == MenuSection.MenuId

上与一对多相关

目前,我正在使用以下查询提取此信息

var menus = from m in _context.Menus                        
                    select m;

这会被送入ASP.NET MVC页面,并且运行正常。

我希望能够对列MenuSection.Order

中的数据进行排序

我试过这样做:

var menus = from m in _context.Menus 
                join ms in _context.MenuSections on m.MenuId equals ms.MenuId
                orderby ms.Order ascending select m;

但它带回了一组不正确的数据。它显示重复的菜单信息。

编辑:澄清我期待的数据应该是:

菜单中有x个菜单。

每个菜单都有很多MenuSection的

我想列出每个菜单及其相关的MenuSection。 MenuSections需要基于MenuSection.Order

Menu 1
- MenuSection 1, Order = 1
- MenuSection 3, Order = 2
Menu 2
- MenuSection 4, Order = 1
- MenuSection 2, Order = 2

3 个答案:

答案 0 :(得分:2)

你试过这样的事吗? ...

var menus = (from m in _context.Menus
            join ms in _context.MenuSections on m.MenuId equals ms.MenuId
            orderby ms.Order ascending select m).Distinct();

或者也许这......

var menus = (from m in _context.Menus
            join ms in _context.MenuSections on m.MenuId equals ms.MenuId
            select new {m, ms.Order})
            .OrderBy(x => x.Order)
            .Select(x => x.m)
            .Distinct();

在第二种情况下,您将排序列投影到新类型中,对其进行排序,然后仅选择原始对象,并区分它。

答案 1 :(得分:2)

第3轮:该问题的最后一次修订澄清了很多。听起来你真正需要的是一个分组。如果没有IntelliSense,那么很难做到正确,但我会尽我所能:

var groupings =
    from m in _context.Menus
    orderby m.Foo
    from ms in m.MenuSections
    orderby ms.Order
    group ms by m;

foreach (var group in groupings)
{
    Menu menu = group.Key;
    // use the Menu

    foreach (MenuSection ms in group)
    {
        // use the MenuSection
    }
}

现在我添加了额外的orderby m.Foo,其中Foo是我认为您可能想要Menu的某些属性。否则,您无法保证知道顶级菜单的顺序。

另请注意我之前所说的m.MenuSections实际上是一个类似于from ms in _context.MenuSections where ms.MenuId == m.MenuId的助手。

答案 2 :(得分:0)

仅仅是一个FYI,我确实通过在执行输出时进行排序来完成这项工作。

我的初衷是使用预先排序的数据集。

这是我的意思的一个例子:

var menus = from m in _context.Menus select m;

foreach (var menu in menus)
{
     Console.WriteLine(menu.Name);
     foreach (var menuSection in menu.MenuSections.OrderBy(o => o.Order))
     {
          Console.WriteLine("\t" + menuSection.Name + ", " + menuSection.Order);
     }
 }