我正在尝试使用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
答案 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);
}
}