sql - 更好的 Linq GroupBy

标签 sql sql-server linq

我们正在一个广告平台上工作,并编写一个负责转换广告的大查询,向消费者转换广告有几个标准,其中一个标准是事件每日预算,所以我们正在做的是我们按单个广告分组以获得展示次数和消耗的成本,然后我们按广告系列分组,产生以下查询:

  (from a in AdCreative
       join h in AdHit on a.ID equals h.AdID into gh
       join l in AdGroup_Location on a.AdGroupID equals l.AdGroupID into gj
       from subloc in gj.DefaultIfEmpty()
       from subhits in gh.DefaultIfEmpty()
       where a.AdDimensionID == 7 && 
             (subloc == null || subloc.LocationID == 23)
       select new {
           ID = a.ID,
           Name = a.Name,
           Spent = (subhits.AdDimension != null) ? ((double)subhits.AdDimension.Credit / 1000 ) : 0,
           CampaignID = a.AdGroup.Campaign.ID,
           CampaignName = a.AdGroup.Campaign.Name,
           CampaignBudget = a.AdGroup.Campaign.DailyBudget

       })
    .GroupBy(adgroup => adgroup.ID)
    .Select(adgroup => new {
        ID = adgroup.Key,
        Name = adgroup.FirstOrDefault().Name,
        Spent = adgroup.Sum(q =>  q.Spent),
        CampaignID = adgroup.FirstOrDefault().CampaignID,
        CampaignName = adgroup.FirstOrDefault().CampaignName,
        CampaignBudget = adgroup.FirstOrDefault().CampaignBudget,
    })
    .GroupBy(q => q.CampaignID)
    .Select(campaigngroup => new {
      CampaignID = campaigngroup.Key,
      DailyBudget = campaigngroup.FirstOrDefault().CampaignBudget,
      Spent = campaigngroup.Sum(q => q.Spent),
      Ads = campaigngroup.GroupBy(q => q.ID).Select(adgroup => new {
        ID = adgroup.Key,
        Name  = adgroup.FirstOrDefault().Name,
        Spent = adgroup.FirstOrDefault().Spent
    })
    })

Results

正如您在屏幕截图中看到的那样,它工作正常,但是当我检查生成的 SQL 查询时,我得到了 402 lines of SQL code .怎么可能呢?有什么我可以做的来增强代码吗

最佳答案

我唯一注意到的是,在最后一个 GroupBy 中,您没有聚合,而是只显示 Key 和第一个值。我想你也可以在那里 Select q.Idq.Nameq.Spent

两个 GroupBy 就足够了,因为您显示了两个级别的聚合(两次 Spent)。

关于sql - 更好的 Linq GroupBy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12821310/

相关文章:

c# - LINQ ToList() 序列化错误?

mysql - 我无法创建这个过程

sql - 根据另一列重置运行总计

sql-server - 如何防止 SSIS 截断平面文件中最后一个数据行的最后一个字段?

mysql - 优化 MySQL 中的查询 - 连接和子查询?

.net - 获取最新更新的子目录

c# - LINQ 按日期降序排列对象集合

javascript - 异步 SQL 循环插入

sql - 如何在SQL查询中获取缓存未命中?

mysql - 在另一个表中插入或更新时增加/减少列