2015-04-02 41 views
0

排序嵌套集我有實體模型是這樣的:如何在LINQ的

表> FormResponse>的FormItem> FormItemType

形式可以有多個FormResponses,但每個FormResponse可以有1的FormItem和FormItem中能有1個FormItem類型。

我想要獲得FormItem.ItemOrder字段排序的響應的所有窗體。所以,這個問題是關於訂購。

下面是我的嘗試,實際工作,但我對ToList()評估我得到FormResponses的疑問。這是否意味着FormResponses將針對每個表單進行評估?意思是,查詢會很慢。 有沒有辦法以更有效的方式寫下面的語句?

試圖刪除ToList()評估,在這種情況下,我得到錯誤IOrderedEnumerable<FormResponse>無法投射到ICollection<FormResponse>

var forms = db.Forms 
       .AsEnumerable() 
       .Select(p => new Form 
       { 
        Name = p.Name, 
        FormResponses = p.FormResponses. 
            .OrderBy(i => i.FormItem.ItemOrder) 
            .ToList(), 
        OrderNumber = p.OrderNumber 
       }) 
       .ToList(); 

感謝

回答

0

如果你想要這個查詢是有效的,所有你需要做的是去除AsEnumerable()電話。然後,而不是在LINQ中完成所有這些工作,它將在數據庫的一面完成。

當然,這項工作仍然需要完成,因爲您已經給自己一個約束條件,即您的最終輸出是包含項目列表的項目列表。考慮到這一要求,無法避免訂購外部集合中每個項目的每個子集合中的所有項目。

+0

我試着刪除AsEnumerable,但我得到的錯誤,說明實體或複雜類型MyModel.Form不能在LINQ構建以查詢實體 – bobetko 2015-04-02 19:05:45

+0

@bobetko然後構建一個匿名類型在EF查詢中,然後將其複製到內存中的「Form」中。 – Servy 2015-04-02 19:09:25

0

表單可以有多個FormResponses,但每個FormResponse可以有1個FormItem,而FormItem可以有1個FormItem類型。

,您可以合併的FormItem和FormItemType到FormResponse