0

我的 dbml 包含一个主表“M”和一个详细表“D1”。

我的 aspx 页面由一个用于显示 M 数据的文本框和一个用于填充 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 中预先加载子项,请将 LoadOptions 与 LoadWith 操作一起使用。

   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,因为它已经在页面加载中设置,只需加载适当的 D1,而无需在按钮单击处理程序中重新加载 M:

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 回答