0

私は適切に正規化されたデータベースを持っていますが、複数の異なるテーブルから十分な情報を一度に結合する選択を実行するための EF クエリを作成するのに問題があります。

関連するデータを取得するために個別のクエリを発行できることはわかっていますが、すべてを一度に (熱心に) クエリできるかどうかを確認したいと思います。

データ モデルは次のようになります。

  • テンプレートには 1 つの ref_TemplateType、1 つの ref_FormType、および多数の TemplateMeasurements があります
  • TemplateMeasurementには 1 つの Measurement があります
  • Measurementには 1 つの ref_MeasurementType と 1 つの Review があります

上記のすべての関連エンティティを含む、すべてのテンプレートのリストを取得したいと考えています。

これが私が始めたものです:

var test = dc.Templates
    .Include(x => x.ref_TemplateType)
    .Include(x => x.ref_FormType)
    .Include(x => x.TemplateMeasurements)
    .ToList();

ここまでは順調ですね。

いいえ、各 TemplateMeasurement エンティティに属する Measurement エンティティを含めたいと思います。したがって、次のようにします (TemplateMeasurements はリストであるため)。

var test = dc.Templates
    .Include(x => x.ref_TemplateType)
    .Include(x => x.ref_FormType)
    .Include(x => x.TemplateMeasurements.Select(y => y.Measurement))
    .ToList();

完全。優秀な。(すばらしい。) これで、各 TemplateMeasurement に対して、適切な Measurement レコードをプルするために結合されます。

でも……それじゃダメ。また、「ref_MeasurementType」関連エンティティを各測定オブジェクトから切り離したいと考えています。したがって、次のようにクエリを絞り込みます。

var test = dc.Templates
    .Include(x => x.ref_TemplateType)
    .Include(x => x.ref_FormType)
    .Include(x => x.TemplateMeasurements.Select(y => y.Measurement.ref_MeasurementType))
    .ToList();

これも効きます!(人生は素晴らしいと思いませんか?)

しかし、ちょっと待ってください..........各測定オブジェクトには、「レビュー」と呼ばれる別の関連エンティティがあります。

これも熱心に取得するにはどうすればよいですか??? 上記の .Select() メソッド呼び出しには入りません...そのメソッドは既に 'ref_MeasurementType' エンティティを取り込むために使用されているためです。

このクエリで「レビュー」エンティティも積極的にフェッチするにはどうすればよいですか?

(この質問を書いている間に解決策を思いついたので、以下を参照してください)

4

1 に答える 1

2

質問を書いているときにこの解決策を思いつきました。:)

テストしたところ、必要に応じて、SQL Server に対して単一の選択クエリが生成されます。

var test = dc.Templates
    .Include(x => x.ref_TemplateType)
    .Include(x => x.ref_FormType)
    .Include(x => x.TemplateMeasurements.Select(y => y.Measurement.ref_MeasurementType))
    .Include(x => x.TemplateMeasurements.Select(y => y.Measurement.Review))
    .ToList();

解決策は、同じ 'TemplateMeasurements' コレクションをトラバースする別の .Include() 行を追加するだけです....しかし、今回は最後の Select() メソッドで、熱心に取得したい他のエンティティを指定できます。

于 2013-12-10T19:08:57.420 に答える