2つのテーブルがあるとしましょう。
- 報告する
- コメント
そして、私がデータベースコンテキストを持っていると仮定します:
var reports = db.Reports();
各レポートのすべてのコメントもロードされていることを確認するにはどうすればよいですか?
この時点で、データベースから切断したいのですが、コメントにはアクセスできます。(例えば:)
reports[0].Comments[0].Subject
2つのテーブルがあるとしましょう。
そして、私がデータベースコンテキストを持っていると仮定します:
var reports = db.Reports();
各レポートのすべてのコメントもロードされていることを確認するにはどうすればよいですか?
この時点で、データベースから切断したいのですが、コメントにはアクセスできます。(例えば:)
reports[0].Comments[0].Subject
LoadOptions を使用してマルチホップ パス (レポート、コメント、別のエンティティ) を定義する場合、3 番目以降のホップが非常に非効率的なコードによって読み込まれることに注意してください (1:n の関係で関連付けられている場合)。親ごとに 1 つのクエリ。レポート コメントについては、問題ありません。2 つのクエリで取得されます。
レポートとコメントの間に 1-M FK の関係があると仮定しています (1 つのレポートに多くのコメントを含めることができます)。
1 つのオプションは、次のようなDataLoadOptions.LoadWithメソッドを使用することです。
var reports = db.Reports();
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Reports>(r => r.Comments); // Ask for Comments along with reports
reports.LoadOptions = dlo;
これで、そのデータ コンテキストでレポートを選択するたびに、コメントが一緒にデータベースから取得されます。
コメントのすべてのフィールドが選択されることに注意してください。このメソッドを使用してフィールドのサブセットを選択する方法はありません。
もう 1 つのオプションは、Linq クエリで何を選択するかを具体的に指定することです。
var myReportsList = from report in db.Reports
select new { // Using anonymous type, but could use a custom class
Report = report,
Comment = report.Comment.Detail, // for example
Subject = report.Comment.Subject
};
クエリが実行され、データベース接続が閉じられるタイミングを理解するには、次のことを理解する必要があります。
Jon Skeets の「C# の詳細」は、これらの優れた概要を示しています。また、「Linq in Action」についても非常に良いことを聞いています。さらに、これらの概念について、私ができるよりも多くの正義を行うブログ投稿がたくさんあります。ここ;o)