0

2つのテーブルがあるとしましょう。

  • 報告する
  • コメント

そして、私がデータベースコンテキストを持っていると仮定します:

var reports = db.Reports();

各レポートのすべてのコメントもロードされていることを確認するにはどうすればよいですか?

この時点で、データベースから切断したいのですが、コメントにはアクセスできます。(例えば:)

reports[0].Comments[0].Subject
4

2 に答える 2

1

LoadOptions を使用してマルチホップ パス (レポート、コメント、別のエンティティ) を定義する場合、3 番目以降のホップが非常に非効率的なコードによって読み込まれることに注意してください (1:n の関係で関連付けられている場合)。親ごとに 1 つのクエリ。レポート コメントについては、問題ありません。2 つのクエリで取得されます。

于 2008-12-11T08:37:28.223 に答える
1

レポートとコメントの間に 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
                    };

クエリが実行され、データベース接続が閉じられるタイミングを理解するには、次のことを理解する必要があります。

  • Linq および Linq To Sql の遅延実行モデル (基本的に、Linq to SQL の場合、コレクションの反復処理やグリッドへのバインドなどによって結果が要求された場合にのみ、クエリが実行されます)
  • IQueryable と IEnumerable の違い

Jon Skeets の「C# の詳細」は、これらの優れた概要を示しています。また、「Linq in Action」についても非常に良いことを聞いています。さらに、これらの概念について、私ができるよりも多くの正義を行うブログ投稿がたくさんあります。ここ;o)

于 2008-12-11T08:11:40.973 に答える