不幸的是,在实体框架中不是原生的。您需要构建自己的解决方案。可能您需要迭代到根目录。您可以通过要求 EF 一次性获得一定数量的父母来优化此算法,如下所示:
...
select new { x.Customer, x.Parent.Customer, x.Parent.Parent.Customer }
使用这种方法,您只能使用静态固定数量的父级(此处为 3),但它会为您节省 2/3 的数据库往返次数。
编辑:我认为我没有正确理解您的数据模型,但我希望这个想法很清楚。
编辑 2:为了回应您的评论和编辑,我采用了这样的方法:
var rootOrg = ...;
var orgLevels = new [] {
select o from db.Orgs where o == rootOrg, //level 0
select o from db.Orgs where o.ParentOrg == rootOrg, //level 1
select o from db.Orgs where o.ParentOrg.ParentOrg == rootOrg, //level 2
select o from db.Orgs where o.ParentOrg.ParentOrg.ParentOrg == rootOrg, //level 3
};
var setOfAllOrgsInSubtree = orgLevels.Aggregate((a, b) => a.Union(b)); //query for all org levels
var customers = from c in db.Customers where setOfAllOrgsInSubtree.Contains(c.Org) select c;
请注意,这仅适用于有界的最大树深度。在实践中,通常是这种情况(例如 10 或 20)。
性能不会很好,但它是一个仅限 LINQ-to-Entities 的解决方案。