想象一下,你有一些看起来像这样的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>
。这使得使用匿名类查询和手动排序等解决方案很痛苦(与一些灵丹妙药解决方案相比,您可以在查询中执行此操作)。
答案 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
}
}
还有两个其他选项似乎与他们自己的利弊有关:
答案 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
}
}
我实现了类似的东西,它对我来说非常好用