3

私たちは広告プラットフォームに取り組んでおり、広告の配信を担当する 1 つの大きなクエリを作成しています。消費者に広告を配信するための基準がいくつかあります。その基準の 1 つはキャンペーンの 1 日の予算です。インプレッションと消費されたコストを取得するために個々の広告別に、次にキャンペーン別にグループ化すると、次のクエリが生成されます。

  (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
    })
    })

結果

スクリーンショットの結果に見られるように正常に動作しますが、生成された SQL クエリを調べたところ、402行の SQL コードが得られました。それはどうしてですか?コードを強化するためにできることはありますか

4

1 に答える 1

0

私が気付く唯一のことは、最後GroupByに集計せず、表示Keyと最初の値のみを表示することです。私はあなたもそうかもしれないと思います、、Select q.Idそしてq.Nameそこq.Spentに。

GroupBy2 つのレベルの集計 (twice ) を示すため、2 つの s で十分であることは理にかなっていますSpent

于 2012-10-10T20:39:47.083 に答える