如何按子属性对集合进行排序?

12

我需要按照子元素的某个字段对父元素进行排序。

示例代码:

IQueryable<Parent> data = context.Parents.Include(o=>o.Children);

//Child有一个成员(字符串)Name。

问题:如何按照子对象的名称对父对象进行排序。

2个回答

44

您的问题有些令人困惑,因为首先它被标记为Entity Framework和LINQ-to-SQL两者。您到底使用哪个ORM?

其次,更重要的是,您说想要按“子项名称”对“父项”进行排序。您想要根据哪个子项名称进行排序?您是否意识到无法将一个名称列表与另一个名称列表进行比较并决定哪个应该排在前面?

因此,如果我假设您想按字典序排序的子项名称进行排序,则解决方案如下(@Paul接近了答案,但您需要指定要进行排序的属性):

context.
Parents.
OrderBy(p => p.
             Children.
             OrderBy(c => c.Name).Select(c => c.Name).FirstOrDefault()
       );
在这种情况下,请考虑以下设置。父元素PA有子元素CBCD,而父元素PB有子元素CCCA。由于排序的结果,父元素PB将在排序列表中排在第一位,因为子元素CA将被用作PB的“主”子元素,而CB将是PA的“主”子元素。如果这不是您要查找的行为,请提供示例和更清晰的说明。

5

您可以选择其中一个子项名称进行排序,最好是通过相应的排序来选择它?

例如:

IQueryable<Parent> data = context.Parents.OrderBy(
     p=>p.Children.OrderBy(chi => chi.Name).FirstOrDefault());

嗨,保罗。这个LINQ抛出了异常:“DbSortClause表达式必须具有可排序的类型。参数名称:键”。 - Nuri YILMAZ
你可以尝试这里描述的方法:http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/3b26c018-a6e5-4cf4-9547-744991ff5ada - Paul
@NuriYILMAZ 这是因为在 FirstOrDefault() 之后,您还需要获取属性或列,例如 FirstOrDefault().MyProperty1 - Idrees Khan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接