2011-11-17 50 views
1

我使用的是MVC3和EF 4.1(Oracle DB)。假设我有:Oracle,Linq和孩子排序

Public Class Parent 
    Public Property Id As Integer 
    Public Property Name As String 
    Public Overridable Property Children As List(Of Child) 
End Class 

Public Class Child 
    Public Property Id As Integer 
    Public Property Name As String 
    Public Property Age As Integer 
End Class 

我想从数据库中检索所有父母,并且可以为每个父母检索其子级。

我要做到以下几点:

Dim firstParent = (From q In db.Parents Select q).First() 

For Each child In firstParent.Children 
    'Do something 
Next 

的问题是,我想从最年轻的孩子们列举到的最古老的。没有客户端排序可能吗?如果是,那我该怎么做到呢?我知道我怎样才能达到我想要的SQL查询,但我不能让它与LINQ ...

编辑: 因为这似乎没有解决方案在我的情况下,每次我排序请求数据是不是一种选择,也许当我将数据插入数据库时​​,我可以做些什么?当我调用db.Save()时,我无法控制EF将项目保存到数据库的顺序,但也许有一些语法可用于根据某些属性进行排序。有任何想法吗?

回答

0

如何从另一个侧面

var children = db.Children.Where(c => c.ParentId == "foo").OrderBy(c => c.Age); 

希望你能转换成vb.net

+0

我其实是一个C#程序员,所以它不是问题。问题是,在真实的情况下,我有4个级别,我希望他们在每个级别都能正确排序...... –

0

这个如果你使用NHibernate可以定义接近它default order加载子集时(使用“ order-by“属性)。由于您使用实体框架,there is no such mapping option,所以你也许可以创建一个特定的库方法(如ParentRepository.GetOrderedChildren(Parent myParent)),并使用LINQ加入加载你的孩子(这是lambda语法):

context.Parents 
    .Join(context.Children, 
     p => p, 
     c => c.Parent, 
     (p, c) => new { Parent = p, Child = c } 
    ) 
    .Where(o => o.Parent == myParent) 
    .OrderBy(o => o.Child.myOrderField) 
    .Select(o => o.Child) 
    .ToList();  

请注意,您的代码可能会受到Select N+1 problem的影响,因为您正在加载所有父母,然后为每位父母加载子女。我建议你做一些eager loading