@Sampathが言うように、これは通常ナビゲーションプロパティを使用して行われますが、彼のコードはあなたが望むことを正確に実行していないと思います。これは(私が思うに)もっと近いです:
var dests = context.Destinations
.Where(d => d.Country == "USA")
.Select(d =>
new { d,
RemoteLodgings = d.Lodgings
.Where(l => l.MilesFromNearestAirport > 5)}
.ToList();
しかし、私があなたの要求を手紙に持っていくならば、それはあなたが望むことをまだしません。宿泊施設が含まれている場所、つまりナビゲーションプロパティが部分的に読み込まれている場所が必要です。これは、エンティティをシリアル化して1つのパッケージで(Web)クライアントに送信する場合に便利です。(ただし、上記の方法でも問題ありません)。
ただし、部分的にロードされたナビゲーションプロパティを使用してコレクションを作成することは可能です。
この本の40ページには、単一のエンティティのナビゲーションプロパティを部分的にロードする方法が示されています(要するに:context.Entry(entity).Collection(e => e.Children).Query().Where(condition)
。しかし、前述のように、これは1つのインスタンスにすぎません。エンティティのコレクションに対してこれを行うのは最善の方法ではありません。
面白いのは(私の同僚が見つけたように)、必要なコレクション要素を個別にコンテキストにロードすることで、エンティティのコレクションに対して簡単に実行できることです。
var lodgings = context.Lodgings
.Where(l => l.MilesFromNearestAirport > 5
&& l.Destination.Country == "USA")
.ToList();
ここでループするcontext.Destinations.Where(d => d.Country == "USA")
と、宿泊施設に「」がロードされていることがわかります>5
。おそらく、この時点でEFが関係の修正を実行したためです。(遅延読み込みはナビゲーションプロパティを完全に読み込むため、遅延読み込みは無効になっています)。
編集(あなたのコメントの後)
あなたがそれがちょっとしたハックだと言うとき、私はこれ以上同意できませんでした。実は、そもそもそのことを言うのを忘れていました。問題は、コードの目的を知らない誰かが遅延読み込みをアクティブにすると、メカニズム全体が崩壊することです。明らかではない方法で状態に依存するコードは好きではありません。だから私はいつも最初のアプローチを好むでしょう。