LINQ OrderBy / ThenBy ChildrenCollection.SortOrder

时间:2012-04-17 16:06:52

标签: c# linq entity-framework linq-to-entities

编辑:

此示例中的两个查询都不按位置排序顺序排序。有没有人对如何做到这一点有任何建议?

我需要一些帮助来按子实体列排序组的实体集合。我有从团体到地点的一对多关系。

我需要按组名称排序组,然后按位置排序顺序排序。

由于子实体是一个集合,我遇到了麻烦。

以下是我正在使用的代码,但返回重复:

 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列的位置按照我需要它们的顺序获取组。

1 个答案:

答案 0 :(得分:1)

您遇到的第二个查询似乎是在尝试按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();

您可能还想将selectedLocation条件添加到订单子句中。

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();