1

次のようなクエリにエンティティ フレームワーク 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( である必要があります) と一致していないことです。 )など)。

4

2 に答える 2