2012-11-07 51 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 });