2013-10-01 20 views
0

我有campaignscampaign stats之間的一對多關係。一個廣告系列統計信息項最多可以在一天內的廣告系列數據庫中有一個條目。如何查詢日期不存在的項目

因此,從13年9月20日開始 - DateTime.Now得到campaigns那裏沒有相關campaign stat,但我也想獲得的實際日期的統計是從

失蹤,我想展示例如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月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, 
        }); 

回答

1

這是醜陋的w ith遞歸但是:

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