2

我正在寻找一些帮助来调整以下 LINQ 查询以返回未来 6 个月内的所有日期,即使是那些在给定月份内没有记录的日期。

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();

对于如何最好地实现这一点,我非常感谢任何帮助或指示。

4

3 回答 3

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() });

请注意,您最终可能会获得额外的一个月,而之前您没有(在该月的第一天?)

于 2012-11-07T16:33:25.663 回答
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() };
于 2012-11-07T16:48:35.070 回答
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 });
于 2012-11-07T17:15:37.580 回答