2011-11-17 61 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