0

私のdbmlには、マスターテーブル「M」と詳細テーブル「D1」が含まれています。

私のaspxページは、Mデータを表示するTextBoxと、D1データを入力するグリッドで構成されています。読み込み時間を節約するために、ボタンがクリックされたときにグリッドにデータが表示されるようにします(D1には多くの行が含まれています)。

質問1:次のコードはそれを行う正しい方法ですか?

protected void Page_Load(object sender, EventArgs e)
{
    MyDataContext context = new MyDataContext();
    M m = context.Ms.Single(n => n.id == id);    // id is somehow provided

    TextBox1.Text = m.field1;
}

protected void Button1_Click(object sender, EventArgs e)
{
    MyDataContext context = new MyDataContext();
    M m = context.Ms.Single(n => n.id == id);   // id is somehow provided

    Grid1.DataSource = m.D1s;
    Grid1.DataBind();
}

質問2:Page_Loadでm.D1にアクセスできるので、これは詳細データがデータベースからすでにフェッチされていることを意味しますか、それとも遅延実行が適用されますか?

4

1 に答える 1

1

子を明示的にロードしない限り、遅延ロードされます。問題がある場合は、リクエストにプロファイラーをアタッチし、プログラムにデバッグして、クエリがいつ発行されるかを確認してください。

LINQ to SQL で子を一括読み込みする場合は、LoadWith 操作で LoadOptions を使用します。

   protected void Button1_Click(object sender, EventArgs e)
   {
       MyDataContext context = new MyDataContext();
       var lo = new DataLoadOptions();
       lo.LoadWith<M>(m => m.D1s);
       context.LoadOptions = lo;

       M m = context.Ms.Single(n => n.id == id);   // id is somehow provided
          Grid1.DataSource = m.D1s;
       Grid1.DataBind();
   }  

この場合、ページ ロードで既に設定されているため m が必要ない場合は、ボタン クリック ハンドラで M をリロードせずに、適切な D1 をロードするだけです。

protected void Button1_Click(object sender, EventArgs e)
 {
     using (MyDataContext context = new MyDataContext())
     {
        IQueryable<D> D = context.D1s.Where(d => d.Mid == id);
        // id is somehow provided
        Grid1.DataSource = D;
        Grid1.DataBind();
     } 
} 
于 2012-10-10T20:57:09.897 に答える