加快LinqDataSource的速度

时间:2011-03-04 18:13:38

标签: asp.net linq-to-sql gridview linqdatasource

问候,我有一个问题。假设数据库中有两个表:

Clients(
  id,
  name,
  address)

Orders(
  id,
  name,
  desc,
  datemodified,
  client_id)

第二个引用第一个,即每个订单都分配给客户端。现在假设我有一个.aspx页面,其中包含Orders表的 LinqDataSource ,以及一个使用此数据源的GridView,并显示一个包含以下列的表:

  1. 订单名称。
  2. 订购desc。
  3. 客户名称。
  4. 客户地址。
  5. 据我所知,Linq to SQL是以这样的方式设计的,默认情况下它不会加载任何关联的实体,它只在请求子属性时才会加载。因此,当加载页面时,将发生以下情况:

    1. 第一个查询将从Orders表中检索记录。
    2. 对于GridView显示的每一行,当请求其中一个客户端属性时,将执行其他查询。
    3. 因此,如果我们有100个订单,这意味着将执行101个查询而不是一个(如果将针对每个客户端属性执行查询,则甚至可能执行201个查询)?如何避免这种情况并使LinqDataSource通过单个查询加载所有必需的字段?

      现在我看到这个问题的唯一解决方法 - 使用带有连接查询的SqlDataSource,它将立即检索所有必需的字段。

2 个答案:

答案 0 :(得分:0)

您可以覆盖LinqDataSource的OnSelecting事件,以使其检索具有您要查找的确切数据的匿名类型:

protected void LinqDataSource_OnSelecting(object sender, LinqDataSourceSelectEventArgs e)
{
    DataContext dc = new DataContext();
    var query = from o in dc.Orders
                select new
                {
                    OrderName = o.name,
                    OrderDesc = o.desc,
                    ClientName = o.Client.name,
                    ClientAddress = o.Client.address
                };
    // Insert any necessary conditional statements adjustments as needed.

    e.Result = query;
}

它将发送到数据库的查询将只获取这四个字段,并使用内部联接进行,因此您只需为每行检索一次数据。

答案 1 :(得分:0)

在LinqDataSource.ContextCreated事件中设置LoadOptions

看看这里怎么做 http://codebetter.com/davidhayden/2007/08/06/linq-to-sql-query-tuning-for-performance-optimization/