2015-02-07 100 views
0

包括多個孩子的水平我使用的投影像這樣:實體框架:在投影

Dim mylist = (From t In context.Myobj1 where t.id=6 _ 
     Select New With {_ 
     .Parent = t, _ 
     .fd = t.ch1.Where(Function(t3) t3.vl>5), _ 
     .fh = t.ch2 _ 
     }).ToList 

的問題是,CH1有一個子集合「CH11」,我想在此投影到包括。

謝謝!


我做一些測試使用下面的建議解決方案,並發現以下問題:

1)有時第二個孩子的水平不loaded.But奇怪的是,這在只發生在第一級兒童中只有一個項目與第二級兒童相關的情況。 (例如,如果在ch1中只有一個項目與ch11中的特定項目相關,ch11中的此項目未加載)

2)此解決方案僅適用於第二級別(當然,孩子的。如果嘗試應用與第三級或更高級別相同的邏輯,則不起作用。

任何解決方案? 謝謝!

回答

2

您可能注意到,您不能使用Include(如t.ch1.Include...)。因此,您必須將子集合添加到投影中,例如通過創建一個嵌套的匿名類型:

Dim mylist = (From t In context.Myobj1 where t.id=6 _ 
      Select New With {_ 
      .Parent = t, _ 
      .fd = From c1 in t.ch1.Where(Function(t3) t3.vl > 5) _ 
        Select New With { _ 
        c1 _ 
        .c11 = c1.ch11 _ 
        }, _ 
      .fh = t.ch2 _ 
      }).ToList 

現在ch1旨意都有他們的孩子集合ch11,因爲EF由關係修正填充它們。

可以證明,如果關閉延遲加載....

context.Configuration.LazyLoadingEnabled = False 

,然後做...

myList.First().fd.First().c1.ch11 

myList.First().fd.First().c11

你」會看到第一個c1ch11集合被返回而不執行新的查詢。 (啓用延遲加載後,它將運行查詢,因爲c1.ch11在僅由關係修復填充時未標記爲已加載)。

+0

謝謝,它的工作,但這個邏輯可以與其他子級別的工作,例如,如果ch11有另一個子級ch111 ....? – alex 2015-02-08 00:59:07

+0

看來,這是不是超越了兒童水平2.任何解決方案? – alex 2015-02-08 01:10:56

+0

你必須爲你想要包含的每個關卡重複這個技巧。 – 2015-02-08 08:12:24