是否可以使用DbContext / DbSet / DbQuery有条件地急切加载导航属性。以下查询将返回具有特定角色的各方。
我需要的是另外只加载匹配的角色。
首次尝试
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 :(得分: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(“关系修正”)将在每个Roles
中自动填充已过滤的Party
集合(如果您不禁用更改跟踪)。如果关系是多对多的,那么它就不那么容易了,你需要在返回匿名对象的结果列表后手动填充集合。
最后一个选项是投票支持热切加载过滤功能:http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1015345-allow-filtering-for-include-extension-method ...并希望它将在未来的EF版本中实施。