如何按日期查询不存在的项目
本文关键字:项目 不存在 查询 何按 日期 | 更新日期: 2023-09-27 18:33:21
我在campaigns
和campaign stats
之间有一对多的关系。一个市场活动统计信息项在数据库中最多可以有一个条目用于一天的市场活动。
所以从 9 年 20 月 13 日 - DateTime.Now
得到没有相关campaign stat
campaigns
,但我也想获得统计数据缺失的实际日期
我想显示例如campaign name
,stat date
(缺少)。我很难想出解决方案,但是我已经编写了此代码来开始。
var fromDate = new DateTime(2013, 9, 20);
var toDate = DateTime.Now;
var dates = Enumerable.Range(0, toDate.Subtract(fromDate).Days + 1)
.Select(d => fromDate.AddDays(d));
var a = from c in _db.Campaigns
join s in _db.CampaignStats on c.Id equals s.CampaignId into s1
from s in s1.DefaultIfEmpty()
where s == null
select new {c, s};
示例输出为:(活动 1 包含 2013 年 9 月 20 日和 2013 年 9 月 22 日的统计数据)
`Campaign 1 9/21/2013`
`Campaign 1 9/23/2013`
`Campaign 1 9/24/2013`
`...`
编辑
使用 Bob 的答案,我形成了这个 LINQ 查询:
(from counts in
(from cal in _db.CalendarMonths
from c in _db.Campaigns
let statCount = (from s in _db.CampaignStats
where s.CampaignId == c.Id
where s.Date == cal.date
group s by s.Id into s1
select s1.Count()).FirstOrDefault()
select new
{
cal.date,
c.Id,
statCount
})
where counts.statCount == 0
select new
{
counts.Id,
counts.date,
});
递
归很丑陋,但是:
SELECT
counts.CalDate,
counts.CampaignId,
FROM
(SELECT
cal.[Date] as CalDate,
c.CampaignId,
(SELECT COUNT(*) FROM CampaignStats WHERE CampaignID = c.CampaignId AND StatDate = cal.[Date]) AS StatCount
FROM
CalendarMonths cal, Campaigns c) counts
WHERE
counts.StatCount = 0