【问题标题】:Enormous SQL generated for Linq-to-Sql Grouping为 Linq-to-Sql 分组生成的大量 SQL
【发布时间】:2011-06-22 06:40:17
【问题描述】:

我有一个 Linq to SQL 查询,它简单地连接三个表,然后执行分组。这是查询:

(from s in mktActualSales
                      join p in sysPeriods on s.PeriodID equals p.PeriodID
                      join d in setupDesignations on s.PositionID equals d.DesignationID
                      group new { s, p } by new{d.Title,d.DesignationID} into temping
                      select
                          new 
                          {
                                 SPOPosition = temping.Key.Title,
                                 SalesPeriods = temping.Select(x=>new {PeriodID = x.p.PeriodID, StartDate = x.p.StartDate, EndDate = x.p.EndDate, SaleTargetID = x.s.ActualSaleID, IsApproved = x.s.IsApproved}),
                                 PositionID = temping.Key.DesignationID
                          }).Take(5)

当我在 LinqPad 中检查此查询生成(执行)的 SQL 时,有 6 个 SQL 语句;第一个执行连接和分组,其余查询相同,只是使用不同的参数一遍又一遍地调用相同的查询。显然参数是分组的Key中包含的值。

这让我相信,对于 130 个组的记录,Linq 将访问数据库 131 次。我怎样才能将这么多的点击量保存到数据库中?我应该在将数据加载到内存后(即在连接查询上调用 ToList 后)执行分组吗?

【问题讨论】:

    标签: sql sql-server asp.net-mvc linq linq-to-sql


    【解决方案1】:

    (我假设 mktActualSales 是您的表格,而您错过了将 Datacontext 放入问题中。)

    如果是您的表,您应该查看 DataContext 上的 LoadOptions。有了这个,您可以预先加载一些相关数据,这可能会防止重复查询。

    http://msdn.microsoft.com/en-us/library/system.data.linq.dataloadoptions.aspx

    如果它不是表格,请查看您如何填充 mktActualSales 但从您的问题来看,我认为它是一张表格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多