【问题标题】:Speeding up LinqDataSource加速 LinqDataSource
【发布时间】:2011-03-04 18:13:38
【问题描述】:

您好,我有以下问题。假设数据库中有两个表:

Clients(
  id,
  name,
  address)

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

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

  1. 订单名称。
  2. 订单说明。
  3. 客户名称。
  4. 客户端地址。

据我了解,Linq to SQL 的设计方式是,默认情况下它不加载任何关联实体,仅在请求子属性时才加载。所以,当一个页面被加载时,会出现如下情况:

  1. 第一个查询将从 Orders 表中检索记录。
  2. 对于 GridView 显示的每一行,当请求其中一个客户端属性时,将执行一个附加查询。

因此,如果我们有 100 个订单,这意味着将执行 101 个查询而不是一个(或者甚至可能是 201 个,如果将为每个客户端属性执行一个查询)?如何避免这种情况并让 LinqDataSource 通过单个查询加载所有必填字段?

现在我看到了解决此问题的唯一方法 - 将 SqlDataSource 与连接查询一起使用,这将一次检索所有必填字段。

【问题讨论】:

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


    【解决方案1】:

    在 LinqDataSource.ContextCreated 事件中设置 LoadOptions

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

    【讨论】:

      【解决方案2】:

      您可以覆盖 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;
      }
      

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

      【讨论】:

      • 这会影响网格视图的更新和删除操作吗?如果我以这种方式切换数据源,LinqDataSource 将如何执行更新和删除请求?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多