残念ながら、Entity Framework ではネイティブではありません。独自のソリューションを構築する必要があります。おそらく、ルートまで繰り返す必要があります。次のように、特定の数の親を一度に取得するように 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 専用のソリューションです。