0

是否可以使用 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();

迭代器不能这样用?

有任何想法吗?

4

1 回答 1

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 版本中实施。

于 2012-04-21T11:54:19.793 回答