次のようなクエリにエンティティ フレームワーク 5 を使用しています。
var query =
from i in context.Instrument
from p in i.InstrumentPerformance // 1 : n
where p.PortfolioScenarioID == 6013
select i;
この (フィルター処理された) クエリのクエリ可能な表現をメモリに格納したいと考えています。理想的には、コンテキストを切断しても、次のように特定の InstrumentPerformance コレクションをリクエストできます。
var perf = query.First(i => i.InstrumentID == 407240).InstrumentPerformance;
しかし、もちろん、これでは望ましい結果が得られません。"perf" オブジェクトには、1:n 結合されたすべての InstrumentPerformance エンティティ (その PortfolioScenarioID が 6013 であるかどうかにかかわらず) を含む InstrumentPerformance コレクションが含まれ、これらのエンティティを遅延経由で取得するためです。 context.ContextOptions.LazyLoadingEnabled = false (または範囲外で実行されているコンテキスト) を使用して、クエリは何も生成しません。
したがって、これは私が取得したい場所とはかけ離れています。元のクエリからメモリ内表現を簡単にクエリできます。私は辞書や同様のアプローチに具現化しようとしましたが、避けたい結果のためにカスタムデータオブジェクトをコーディングすることになりました。
だから私の質問は、そのようなメモリ内ビューを取得するための推奨される方法は何ですか?
編集:現在、データをキャッシュするために2つの辞書を使用しています。
var instruments = (
from i in context.Instrument
from p in i.InstrumentPerformance
where p.PortfolioScenarioID == 6013
select i)
.ToDictionary (i => p.InstrumentID, i => i);
var performances = (
from i in context.Instrument
from p in i.InstrumentPerformance
where p.PortfolioScenarioID == 6013
select p)
.ToDictionary (p => p.InstrumentID, p => p);
ただし、これにはデータベースへの 2 回のラウンドトリップが必要であり、1 回で十分と思われます。さらに重要なのは、パフォーマンス データ (現在は performances[InstrumentID]) をクエリするためのセマンティクスが EF のクエリ方法 (instrument.InstrumentPerformance.First( である必要があります) と一致していないことです。 )など)。