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

时间:2009-12-06 08:16:18

标签: c# linq linq-to-entities

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

public class Parent
{
    public int ID { get; set; }
    public List<Child> 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<Parent>。这使得使用匿名类查询和手动排序等解决方案很痛苦(与一些灵丹妙药解决方案相比,您可以在查询中执行此操作)。

4 个答案:

答案 0 :(得分:3)

Alex James在this tip中讨论了这个问题。

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

答案 1 :(得分:0)

看看这个post。你可以尝试这样的事情:

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

答案 2 :(得分:0)

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

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 ".Include" orderby in subquery

LINQ OrderBy Name ThenBy ChildrenCollection.Name

答案 3 :(得分:0)

这是我做过的事情:

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

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