2012-01-27 23 views
1

我正在使用PredicateBuilder和LINQKit構建相當複雜的動態查詢。模型結構看起來有點像實體框架OrderBy On已加入集合

MediaGallery (one-to-many) MediaGalleryItems (one-one) MediaItems 

我渴望加載這整個關係,該部分工作正常。

每個MediaGalleryItem都有一個'Order'屬性,它允許庫中的項目具有特定的順序。我需要排序依據這一點,讓我有種想要做的:

IQueryable<MediaGallery> query = ... 
... lots of stuff ... 
query = query.OrderBy(m => m.MediaGalleryItems.Order) 

但顯然是不會工作的MediaGalleryItems是MediaGalleryItem對象的集合。我也試過

query = query.OrderBy(m => m.MediaGalleryItems.OrderBy(mgi => mgi.SortOrder)); 

編譯但不起作用。它似乎應該很容易,我錯過了明顯的東西?

編輯:我應該說我限制到一個單一的MediaGallery,所以如果我是手寫SQL它可能是有意義的做這樣的事情,以減少DB人次。 Joachim Isaksson的評論正確地指出,如果您不是首先通過MediaGallery.Id訂購,這可能會導致多個MediaGallery混亂。

我想我的問題是,有什麼辦法強迫Linq輸出我在這裏需要的SQL,還是應該讓我自己輕鬆一下,然後再次訪問數據庫?

+1

你真的不能用一個集合命令,這將是MediaGalleries的預期順序如果MediaGallery1有2個項目與順序1和4,而MediaGalley2訂單2和3有2個項目? – 2012-01-27 11:08:38

+0

好點,謝謝。不過,我應該說我選擇了一個MediaGallery,所以在這種情況下,爲了減少數據庫行程似乎是合理的。如果這是不可能的,我可以理解爲什麼要考慮更廣泛的圖景。 – NickH 2012-01-27 11:15:33

+0

'query'是什麼?它是一個'MediaGallery'集合?請發佈樣本數據和預期結果。也許你正在尋找'firstordefault'? – danihp 2012-01-27 11:22:41

回答

0

在向用戶展示它們之前,您必須在應用程序中訂購商品。急切的加載不提供排序導航屬性(關係),即使它確實EF也可能不會確保這個訂單在實現後保留,因爲它不使用任何有序集合(如果允許延遲加載,它使用基於散列集的集合)。

如果你想訂購的關係,你必須使用投影:

var query = from x in context.MediaGallery 
      where x ... 
      select new 
       { 
        MediaGellery = x, 
        MediaGalleryItems = x.MediaGalleryItems.OrderBy(i => i.Order) 
       };