2012-04-21 102 views
0

是否有可能使用DbContext/DbSet/DbQuery有條件地加載導航屬性。以下查詢將返回具有特定角色的派對。EF代碼優先4.3有條件加載導航屬性

我需要的是另外只加載匹配的角色。

第一次嘗試

var peopleWithRole = (from p in Party 
    from r in p.Roles 
    where r.RoleTypeId == 1 
    select p).Include(_ => _.Roles); 

這會將所有的角色,爲什麼一旦你看它很明顯。

我已經嘗試了幾件事情。如果我必須施放並創建一個對象來做到這一點,那我就無法弄清楚。

第二次嘗試

var objectContext = ((IObjectContextAdapter)this).ObjectContext; 
var set = objectContext.CreateObjectSet<Party>(); 
var result = (from p in set.Where("it.Roles.RoleTypeId == 1") 
       select p) 
; 
result.Dump(); 

迭代器不能用這樣的嗎?

任何想法?

+0

http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx – Jim 2012-05-10 05:28:14

回答

0

不支持通過預加載進行篩選和排序。在一個單一的往返加載數據的唯一途徑是投影:

var peopleWithRole = (from p in Party 
         select new 
         { 
          Party = p, 
          Roles = p.Roles.Where(r => r.RoleTypeId == 1) 
         }) 
         .ToList() 
         .Select(a => a.Party); 

如果關係是一對許多EF(「關係修正」)將在每個Party自動填充過濾Roles集合(如果你不會禁用更改跟蹤)。如果關係是多對多的,那麼這並不容易,而且您需要在返回匿名對象的結果列表後手動填充集合。

最後一個選項是在這裏投票選擇加載過濾功能:http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1015345-allow-filtering-for-include-extension-method ...並希望它能在未來的EF版本中實現。

+0

I最終得出這個結論。感謝您的確認。我希望他們添加該功能。 – Jim 2012-04-23 04:45:51

+0

這可能有幫助,看起來你現在可以做到。我會測試它來確認,我剛剛找到了這個鏈接。 http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx – Jim 2012-05-10 05:29:01

+0

@Jim:No ,過濾只能用*顯式加載*(=兩個數據庫查詢),而不能用於加載。 EF 5(測試版)甚至不提供過載加載的過濾功能,我們仍然需要等待...... – Slauma 2012-05-10 09:01:27