親と子の間に 1 対 1 の関係がある場合 (可能性は低いですが、例はそれを暗示しているようです)、次のようにできます。
return db.Parents
.Where(parent => parent.Status == 1)
.Select(parent => parent.Child)
.Where(filter)
.Select(child=> child.Parent);
そうでなければ、それは難しいでしょう。
動的 linqでそれを行うこともできますが、それはおそらくやり過ぎです。
式ツリーを手動で生成することもできますが、これも非常に複雑です。私はそれを自分で試していません。
もちろん、最後の手段として、常に を呼び出すことができますyourQuery.AsEnumerable()。これにより、linq-to-sql がクエリをこの時点までの sql に変換し、クライアント側で残りの作業を実行します。次に、式を .compile() できます。ただし、linq-to-sql のパフォーマンス上の利点は失われます (また、compile() 自体は非常に低速です。実行されるたびに JIT コンパイラが呼び出されます)。
return db.Parents
.Where(parent => parent.Status == 1)
.AsEnumerable()
.Where(parent => filter.Compile().Invoke(parent.Child))
個人的には、式を 2 回定義します。1 回は子用、もう 1 回は parent.child 用です。
Expression<Func<Child, bool>> filterChild = child => child.Status == 1;
Expression<Func<Parent, bool>> filterParent = parent => parent.Child.Status == 1;
最もエレガントではないかもしれませんが、おそらく他のソリューションよりも保守が容易です