2012-04-21 100 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