自我加入不包括儿童(实体框架4.0)

时间:2011-02-13 18:11:29

标签: c# entity-framework-4

我在实体框架4.0中创建了一种家谱。我遇到过一个问题,即实体框架只加载了直接的孩子。即使我指定了include,它也不会加载孩子的孩子。

例如,这是我的查询: -

public IQueryable<TreeMember> GetTreeMembers(int userId)
        {
            return this.ObjectContext.TreeMembers.Include("RelatedTreeMembers").Where(u => u.UserId == userId && u.RelatedTreeMemberId == null);
        }

这会加载第一级别的孩子。但它并不会影响孩子们的孩子。如果我必须包括孩子的孩子,我必须写: -

public IQueryable<TreeMember> GetTreeMembers(int userId)
        {
            return this.ObjectContext.TreeMembers.Include("RelatedTreeMembers.RelatedTreeMembers").Where(u => u.UserId == userId && u.RelatedTreeMemberId == null);
        }

这很快就会让人感到沮丧,因为我不知道应该多少次写这个RelatedTreeMembers因为家谱可以扩展到N级。我如何解决这个问题?如果我的问题不明确,请告诉我。

提前致谢:)

2 个答案:

答案 0 :(得分:2)

这就是EF的工作原理。您希望定义递归(分层)查询,这在EF中急切加载是不可能的。您总是准确指定要加载的导航属性 - 显然在这种情况下您不能,因为您不知道递归的深度。

我喜欢@Magnus在CTE中提出的想法,但我不会使用DB View。我会使用存储过程。原因是您已将实体TreeMember映射到表。如果定义视图,则无法将其映射到同一实体类型。您将需要视图的新实体。如果使用存储过程,则可以将其结果映射到现有实体类型。

另一种方法是使用延迟加载。

答案 1 :(得分:1)

使用递归CTE编写视图,然后使用Linq。 http://msdn.microsoft.com/en-us/library/ms186243.aspx