使用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 } }
我实现了类似的东西,它对我来说非常好