问候,我有一个问题。假设数据库中有两个表:
Clients(
id,
name,
address)
Orders(
id,
name,
desc,
datemodified,
client_id)
第二个引用第一个,即每个订单都分配给客户端。现在假设我有一个.aspx页面,其中包含Orders表的 LinqDataSource ,以及一个使用此数据源的GridView,并显示一个包含以下列的表:
据我所知,Linq to SQL是以这样的方式设计的,默认情况下它不会加载任何关联的实体,它只在请求子属性时才会加载。因此,当加载页面时,将发生以下情况:
因此,如果我们有100个订单,这意味着将执行101个查询而不是一个(如果将针对每个客户端属性执行查询,则甚至可能执行201个查询)?如何避免这种情况并使LinqDataSource通过单个查询加载所有必需的字段?
现在我看到这个问题的唯一解决方法 - 使用带有连接查询的SqlDataSource,它将立即检索所有必需的字段。
答案 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/