LINQ OrderBy/ThenBy ChildrenCollection.SortOrder
本文关键字:ChildrenCollection SortOrder ThenBy OrderBy LINQ | 更新日期: 2023-09-27 18:31:29
编辑:
此示例中的两个查询都不按位置排序顺序排序。有人对如何做到这一点有任何建议吗?
我需要一些帮助来按子实体列对组的实体集合进行排序。我有从组到位置的一对多关系。
我需要按组名称排序,然后按位置排序顺序对组进行排序。
由于子实体是一个集合,因此我遇到了麻烦。
这是我正在使用的代码,它有效但返回重复项:
var groups = db.GetNavigationGroups()
.Where(g => selectedLocation > 0 ? g.NavigationGroupLocations.Any(l => l.Location == selectedLocation) : true)
.SelectMany(g => g.NavigationGroupLocations, (g, l) => new { g, l })
.OrderBy(x => x.g.Name)
.ThenBy(x => x.l.SortOrder)
.Select(x => x.g);
然后我尝试了使用FirstOrDefault()的方法:
List<NavigationGroup> groups = db.DataModel.NavigationGroups
.Where(g => selectedLocation > 0 ? g.NavigationGroupLocations.Any(l => l.Location == selectedLocation) : true)
.OrderBy(g => g.Name)
.ThenBy(g => g.NavigationGroupLocations.Where(l => l.Location == selectedLocation && l.GroupID == g.ID).OrderBy(l => l.SortOrder).FirstOrDefault())
.ToList();
问题是我似乎无法根据位置 SortOrder 列按我需要的顺序获取组。
您拥有的第二个查询看起来像您正在尝试按 NavigationGroupLocations 对象而不是其字段进行排序。你试过吗:
List<NavigationGroup> groups = db.DataModel.NavigationGroups
.Where(g => selectedLocation > 0 ? g.NavigationGroupLocations.Any(l => l.Location == selectedLocation) : true)
.OrderBy(g => g.Name)
.ThenBy(g => g.NavigationGroupLocations.Where(l => l.Location == selectedLocation && l.GroupID == g.ID).OrderBy(l => l.SortOrder).FirstOrDefault().SortOrder)
.ToList();
您可能还希望将选定的位置条件添加到订单子句中。
List<NavigationGroup> groups = db.DataModel.NavigationGroups
.Where(g => selectedLocation > 0 ? g.NavigationGroupLocations.Any(l => l.Location == selectedLocation) : true)
.OrderBy(g => g.Name)
.ThenBy(g => g.NavigationGroupLocations.Where(l => selectedLocation > 0 ? l.Location == selectedLocation : true && l.GroupID == g.ID).OrderBy(l => l.SortOrder).FirstOrDefault().SortOrder)
.ToList();