2012-11-07 52 views
2

我正在尋找一些幫助,以適應以下LINQ查詢返回在未來6個月內的所有日期,即使那些沒有記錄屬於給定的月份。LINQ查詢在一段時間內按月分組記錄

var maxDate = DateTime.Now.AddMonths(6); 

var orders = (from ord in db.Items 

where (ord.Expiry >= DateTime.Now && ord.Expiry <= maxDate) 

group ord by new 
    { 
     ord.Expiry.Value.Year, 
     ord.Expiry.Value.Month 
    } 
into g 
select new ExpiriesOwnedModel 
    { 
     Month = g.Select(n => n.Expiry.Value.Month).First(), 
     Quantity = g.Count() 
    }).ToList(); 

我真的很感謝任何幫助或指示如何最好地實現這一點。

回答

3

我不知道它會如何與數據庫進行交互,但我會做到這一點作爲一個加盟:

var firstDaysOfMonths = Enumerable.Range(0, 7).Select(i => 
    new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddMonths(i)); 
var orders = firstDaysOfMonths.GroupJoin(
    db.Items, 
    fd => fd, 
    ord => new DateTime(ord.Expiry.Value.Year, ord.Expiry.Value.Month, 1), 
    (fd, ords) => new { Month = fd.Month, Quantity = ords.Count() }); 

注意您可以用額外的一個月,你以前沒結束「T(在每月的第一天?)

2

被盜從Rawling的答案,如果你喜歡的查詢語法組連接(我):

var orders = 
    from month in Enumerable.Range(0, 7) 
     .Select(i => new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddMonths(i)) 
    join ord in db.Items 
     on month equals new DateTime(ord.Expiry.Value.Year, ord.Expiry.Value.Month, 1) 
     into ords 
    select new { month.Month, Quantity = ords.Count() }; 
0

的選擇,如果它不與發揮好數據庫:

var rawGroups = db.Items.Where(item.Expiry >= DateTime.Now && ord.Expiry <= maxDate) 
         .GroupBy(item => new 
          { 
          item.Expiry.Value.Year, 
          item.Expiry.Value.Month 
          }, g => new ExpiriesOwnedModel() 
          { 
          Month = g.Key.Month, 
          Quantity = g.Count() 
          }).ToDictionary(model => model.Month); 

var result = Enumerable.Range(DateTime.Now.Month,6) 
         .Select(i => i > 12 ? i - 12 , i) 
         .Select(i => rawGroups.Keys.Contains(i) ? 
            rawGroups[i] : 
            new ExpiriesOwnedModel() 
            { Month = i , Quantity = 0 });