Entity framework EF Code First 4.3有条件加载导航属性

Entity framework EF Code First 4.3有条件加载导航属性,entity-framework,navigation,code-first,eager-loading,Entity Framework,Navigation,Code First,Eager Loading,是否可以使用DbContext/DbSet/DbQuery有条件地加载导航属性。下面的查询将返回具有特定角色的参与方 我需要的是另外只加载匹配的角色 第一次尝试 这会加载所有的角色,很明显,当你看到它的时候 我试过一些东西。如果我必须强制转换并创建一个objectquery来做这件事,那就没问题了,我就是不知道该怎么做 第二次尝试 迭代器不能这样使用吗 有什么想法吗?不支持使用即时加载进行筛选和排序。在一次往返中加载数据的唯一方法是投影: var peopleWithRole = (from p

是否可以使用DbContext/DbSet/DbQuery有条件地加载导航属性。下面的查询将返回具有特定角色的参与方

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

第一次尝试

这会加载所有的角色,很明显,当你看到它的时候

我试过一些东西。如果我必须强制转换并创建一个objectquery来做这件事,那就没问题了,我就是不知道该怎么做

第二次尝试

迭代器不能这样使用吗


有什么想法吗?

不支持使用即时加载进行筛选和排序。在一次往返中加载数据的唯一方法是投影:

var peopleWithRole = (from p in Party
                      select new
                      {
                          Party = p,
                          Roles = p.Roles.Where(r => r.RoleTypeId == 1)
                      })
                      .ToList()
                      .Select(a => a.Party);
如果关系是一对多EF关系,则如果不禁用更改跟踪,则fixup将在各方中自动填充筛选的角色集合。如果关系是多对多的,那么工作起来就不那么容易,您需要在返回匿名对象的结果列表后手动填充集合


最后一个选项是投票支持此处的“急切加载筛选”功能:。。。希望它能在未来的EF版本中实现。

我最终得出了这个结论。谢谢你的确认。我真的希望他们增加这个功能。这可能会有帮助,看起来你现在真的可以做到了。我将测试它以确认,我刚刚找到这个链接@Jim:不,只有在显式加载=两个DB查询时才可能进行过滤,而不是在急切加载时。在EF 5 beta版中甚至不提供带即时加载的过滤功能,我们仍需等待…你是对的,希望他们添加它。集合加载示例不是我们实际需要的。它必须使用完整的linq查询语义,并限制导航。
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();
var peopleWithRole = (from p in Party
                      select new
                      {
                          Party = p,
                          Roles = p.Roles.Where(r => r.RoleTypeId == 1)
                      })
                      .ToList()
                      .Select(a => a.Party);