作成する必要があるデータベースからのクエリがあります。T-SQL でクエリを記述する方法を理解しています。実際のクエリはもっと複雑ですが、パターンを簡単に説明すると次のようになります。
SELECT * FROM [dbo].[A] AS a
LEFT JOIN dbo.[B] AS b ON a.ID = b.ParentID
LEFT JOIN dbo.[C] AS c ON y.ID = c.ParentID
LEFT JOIN
(
SELECT * FROM dbo.[D]
WHERE OtherID = @otherID
) AS d ON c.ID = d.ParentID
LEFT JOIN
(
SELECT * FROM dbo.[E]
WHERE OtherID = @otherID
) AS e ON e.ID = e.ParentID
WHERE A.ID = @Id
上記のフィルター処理されたインライン ビューと同等のものを生成するように、SQL を C# linq to sql (entityframework コア用) で記述する必要があります。目標は明らかに、ツリー A->B->C を常に含み、D または E を含む結果セットを、それらのノードが 2 次フィルタリングにも一致する場合にのみ返すことです。インライン ビュー内でフィルタリングを行うのは非常に簡単ですが、インライン ビューの外でフィルタリングを行うのは非常に難しいことに注意してください。それは意図ではありません。
ありがとう
PS: 明確にするために、最初に上記を次のように記述してみてください。
query = from a in context.A
join bt in context.B on a.ID equals bt.ParentID into btent
from b in btent.DefaultIfEmpty()
join ct in context.C on b.ID equals ct.ParentID into ctent
from c in ctent.DefaultIfEmpty()
join dt in context.D on c.ID equals dt.ParentID into dtent
from d in dtent.DefaultIfEmpty()
.Include(a => a.B).ThenInclude(b => b.C).ThenInclude(c => c.D)
.Where(a => a.ID = myPrimaryID && d.OtherId = myOtherID)
問題は、「d」エンティティの where 句が D エンティティが存在する行のみを返すため、そうでない場合はスタック全体が空になることです。'd' エンティティが null であるかフィルターに一致する場合にフィルターをかわいく取得しようとすると、その状況で EF によって生成された sql を調べると、それは正しくありません。上記の T-SQL と同様に、「結合」内で正しいフィルタリングを行う必要があります。
PPS: はい、親オブジェクト以外をフィルタリングしていない場合は、これを完全に省略して、インクルードと where 句を記述するだけでかまいませんが、よく考えてみると、ある用語でフィルタリングすると、ひ孫はフィルターをかけませんが、孫はコンプレックスです。どちらかの「フォーム」でクエリを書き出すことができれば、ありがたいです。