2009-12-06 59 views
3

想象一下,你已經有了一些看起來像這樣的Entity Framework實體(顯然不是這些特定的類,而是自動生成的所有實體框架管道的實體;這些只是爲了說明):使用LINQ-to-Entities選擇父項時排序子對象

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爲了父母的列表。我希望孩子們可以在其父母的數字屬性中進行排序。 這怎麼辦?

編輯:澄清:這個想法是讓查詢隱藏在方法調用(在圖層外觀)後面,該方法調用簡單地返回IList<Parent>。這使得像匿名類查詢和手動排序這樣的解決方案變得痛苦(與一些萬能解決方案相比,您可以在查詢中完成它)。

回答

3

亞歷克斯詹姆斯在this tip討論這個問題。

基本上,關係被認爲是無序的,每個標準的關係建模。所以你不能對它們進行排序。但是你可以投射到其他收藏,其中可以排序。

+0

另外,您無法在無序中讀取它們,將它們從EntityCollection中取出,手動對它們進行排序,然後將它們放回到它們的EntityCollection中(當然假設NoTracking處於打開狀態)。當你迭代EntityCollection時,它們無論如何都會出錯。 :( – 2009-12-11 13:09:55

+0

對,因爲'EntityCollection's *無序。* – 2009-12-11 13:30:07

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"); 
+0

對不起達林,我試過你的例子,它不起作用。這兩個from語句導致Parent和Child之間的連接,並導致每個孩子返回一個父級。所以你會得到返回的每個家長出現多次,每個包含他們所有(仍未排序)的孩子! – 2009-12-06 09:13:03

+1

看看另一個提示:http://blogs.msdn.com/alexj/archive/2009/02/25/tip-1-sorting-relationships-in-entity-framework.aspx – 2009-12-09 13:55:23

+0

@克雷格Stuntz:克雷格,你的鏈接實際上似乎是直接從微軟官員那裏得到的答案(或者是非答案,真的!)。你應該提交它作爲答案,我會接受它。 – 2009-12-10 02:03:37

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

+0

感謝您的建議!不過,我認爲你的第一個有點笨拙,因爲它需要你手動排列東西,這使得DB使用LINQ查詢來做到這一點(並且增加了整潔性)。 第一個鏈接可接受的解決方案實際上並不奏效(我已對此發表了評論,所以看看)。 第二個環節似乎是在談論孩子們分揀父母,然後選擇孩子,這不是我正在尋找的。 我正在尋找一個整潔的萬靈丹解決方案,並根據您的答案和其他答案來判斷,它根本不存在於實體框架中 – 2009-12-10 02:00:42

+0

我認爲您是對的......至少在版本中不包含3.5 。不知道大約4.0還有... – mkedobbs 2009-12-10 16:28:54

0

這裏的東西,我已經做了:

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

我實現了像t他和我的工作非常好

+0

感謝您的建議,但是,我不想使用匿名類。我的數據庫代碼隱藏在它自己的層中,所以我有一個返回IList 的方法調用。爲了實現這一點,使用匿名類是笨拙的,因爲我不得不手動重建對象樹(手動將孩子放入父母然後返回父母)。這違背了讓Entity Framework和LINQ爲我管理關係和對象圖創建的目的。 – 2009-12-10 01:43:54

相關問題