0

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

Clients(
  id,
  name,
  address)

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

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

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

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

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

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

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

4

2 回答 2

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;
}

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

于 2011-03-04T18:47:01.760 回答
0

在 LinqDataSource.ContextCreated 事件中设置 LoadOptions

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

于 2011-03-06T16:40:00.010 回答