Asp.net 加速LinqDataSource

Asp.net 加速LinqDataSource,asp.net,linq-to-sql,gridview,linqdatasource,Asp.net,Linq To Sql,Gridview,Linqdatasource,你好,我有一个问题。假设数据库中有两个表: Clients( id, name, address) Orders( id, name, desc, datemodified, client_id) 第二个引用第一个,即每个订单都分配给客户机。现在,假设我有一个.aspx页面,其中有一个用于Orders表的LinqDataSource,还有一个GridView,它使用此数据源并显示一个包含以下列的表: 订单名称 订单描述 客户端名称 客户地址 据我所知,LINQ

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

Clients(
  id,
  name,
  address)

Orders(
  id,
  name,
  desc,
  datemodified,
  client_id)
第二个引用第一个,即每个订单都分配给客户机。现在,假设我有一个.aspx页面,其中有一个用于Orders表的LinqDataSource,还有一个GridView,它使用此数据源并显示一个包含以下列的表:

  • 订单名称
  • 订单描述
  • 客户端名称
  • 客户地址
  • 据我所知,LINQtoSQL的设计方式是,默认情况下,它不加载任何关联的实体,只在请求子属性时才加载。因此,当加载页面时,将出现以下情况:

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


    现在我看到了解决此问题的唯一方法-使用带有联接查询的SqlDataSource,该查询将一次检索所有必需字段。

    您可以覆盖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.ContextCreated事件中设置LoadOptions

    看看这里怎么做

    这会影响网格视图的更新和删除操作吗?如果以这种方式切换数据源,LinqDataSource将如何执行更新和删除请求?