使用LINQ-to-Entities选择父对象时对子对象进行排序

想象一下,你有一些看起来像这样的Entity Framework实体(显然不是这些特定的类,而是带有所有Entity Framework管道的自动生成的实体;这些只是为了说明):

public class Parent { public int ID { get; set; } public List Children { get; set; } } public class Child { public int ID { get; set; } public Parent Parent { get; set; } public int Number { get; set; } } 

我有一个LINQ查询,如下所示:

 from parent in context.Parents.Include("Child") select parent 

但是,这将返回子项列表,其中子项符合ID顺序。 我希望子项按其Parent中的Number属性排序。 如何才能做到这一点?

编辑:澄清:想法是将查询隐藏在方法调用(在图层外观)中,它只返回一个IList 。 这使得使用匿名类查询和手动排序等解决方案变得痛苦(与一些灵丹妙药解决方案相比,您可以在查询中执行此操作)。

Alex James在本文中讨论了这个问题。

从本质上讲,根据标准关系建模,关系被视为无序关系。 所以你无法对它们进行排序。 但是您可以投影到其他可以排序的集合。

看看这篇文章 。 你可以尝试这样的事情:

 var query = ((from parent in context.Parents from child in parent.Child orderby child.Number ascending select parent) as ObjectQuery ).Include("Child"); 

一种选择是在内存中执行查询和排序(例如,在输出上)。

 var parents = context.Parents.Include("Child").ToList(); //note that ToList is here just to execute the query and get the objects in memory foreach (var p in parents) { //do something with parent item foreach (var c in p.Child.OrderBy(c => c.Number)) { /do something with the child item } } 

还有两个其他选项似乎与他们自己的优点和缺点一起使用:

LINQ“。包含”在子查询中的orderby

LINQ OrderBy Name ThenBy ChildrenCollection.Name

这是我做过的事情:

 var query = from parent in context.Parents select new { parent, childs = from child in context.Child orderby child.ID ascending select new { child } } 

我实现了类似的东西,它对我来说非常好