首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加速LinqDataSource

加速LinqDataSource
EN

Stack Overflow用户
提问于 2011-03-04 18:13:38
回答 2查看 900关注 0票数 0

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

代码语言:javascript
复制
Clients(
  id,
  name,
  address)

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

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

  1. Order name.
  2. Order desc.
  3. 客户端名称.
  4. 客户端地址.

G 212

据我所知,Linq to SQL的设计方式是:默认情况下,它不加载任何关联实体,只在请求子属性时才加载。因此,当加载页面时,将出现以下情况:

  1. 第一次查询将从Orders表中检索记录。对于GridView显示的每一行,当请求客户端属性之一时,将执行额外的查询。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-06 16:40:00

在LoadOptions事件中设置LinqDataSource.ContextCreated

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

票数 0
EN

Stack Overflow用户

发布于 2011-03-04 18:47:01

您可以重写LinqDataSource的LinqDataSource事件,让它使用您要查找的确切数据检索匿名类型:

代码语言:javascript
复制
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;
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5197606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档