2012-08-11 40 views
2

我需要首先使用EF 4.1代碼檢索數據,這些數據包含在幾個相關的表中。目前,如果我用這個將相關實體加載到不同的查詢和子集合排序中

return Context.Set<Entity>() 
       .Include(x => x.Children.Select(y => y.GrandChildren.Select(z => z.Child))) 
       .Include(x => x.SomeEntity) 
       .Include(x => x.AnotherEntity) 
       .OrderByDescending(x => x.Id) 
       .FirstOrDefault(); 

的數據是獲取正確的,但我擔心兩件事情:

1)似乎沒有辦法孩子/孫子排序

2)

    012:數據在一個表中,這意味着實體(和所有其他)數據被複製爲孫輩每人記錄

    問題扁平

  • 我需要做些什麼來排序兒童/孫子女?
  • 在這種特殊情況下,第二點本身可能不成問題,因爲傳輸的數據量並不大 - 最多30條包含30列的記錄。不過,我想知道是否有辦法分別加載Enttity,Children和GrandChildren(3個查詢),並將它們加入客戶端?

返回的結果集需要更新。

回答

3

我需要做些什麼才能對兒童/大孩子進行排序?

將它們排序在您的應用程序中。這是唯一可靠的方法。包含並不允許排序,下面顯示的方法不可靠,因爲您無法控制EF的內部機制,並且您不能將導航屬性設置爲SortedList或其他集合維護排序順序(要求具有可靠性排序關係)。

數據在一個表中,這意味着實體(和所有其他)數據被複製爲孫輩每人記錄

這是valid objection平坦化。您可以通過關閉延遲加載避免它,並使用單獨的查詢來加載數據:

context.Configuration.LazyLoadingEnabled = false; 
var parent = context.Set<Entity>().First(e => e.Name = "ABC"); 
// Load relations in separate query 
context.Set<Child>() 
     .Where(c => c.Parent.Name == "ABC") 
     .OrderBy(c => c.Name) // You can at least try it but as mentioned above it may not work in all scenarios 
     .Load(); 
// Now parent.Children collection should be filled 

您可以按照同樣的方法對其他關係,嵌套關係也是如此。關鍵是要正確構造兒童和孫子裝載的Where條件。

這並不意味着這種方法會更快,扁平化表。這種方法爲每個已執行的查詢分別執行數據庫往返傳遞,因此扁平化表可以在較小的數據集中更快。