我们正在开发一个广告平台,编写负责服务广告的一个大查询语句,其中有一些服务消费者广告的条件,其中之一是每日预算。所以我们的做法是按个人广告分组获取展示次数和消耗成本,然后再按活动分组,得到以下查询语句:
(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代码。这是什么情况?有什么我可以做来优化代码吗?