Linq按周数分组,包括0个记录周

本文关键字:包括 0个 记录 周数 Linq | 更新日期: 2023-09-27 18:28:24

我正在尝试获取SSRS折线图的数据集。我试图显示过去六个月一年中每周的记录数量。为了使折线图准确,我必须显示零记录的周数。

我想为折线图提供如下数据:

Year  Week  Count
2014  52    13
2015  1     0
2015  2     16

下面的linq查询得到了我所需要的一切,减去了没有记录的周:

 list = (from t in context.Cats.Where(
                     t => t.Name == "Fluffy" &&
                  (t.Recorded >= start && t.Recorded <= end)
                      ).AsEnumerable()
                        group t by new { Year = t.Recorded.Year, WeekNumber = (t.Recorded - new DateTime(t.Recorded.Year, 1, 1)).Days / 7 } into ut
                        select new TrendRecord
                        {
                            Year = ut.Key.Year,
                            Week = ut.Key.WeekNumber,
                            Count = ut.Count()
                        }).OrderBy(t => t.Year).ThenBy(t => t.Week).ToList<TrendRecord>(); 

我看了这个问题,但似乎都不太适合我的困境。

我倾向于创建一个列表,列出开始日期和结束日期之间所有可能的周数,然后以某种方式将我的数据加入其中,这样就可以显示0条记录的周数。

这是一个可以接受的方法来解决这个问题吗(如果是,请告诉我如何处理)?有没有一种方法可以在一个查询中做到这一点,而不需要加入单独的列表?

Linq按周数分组,包括0个记录周

您将需要一个周的列表,并使用Linq执行某种LEFT OUTER JOIN。

这样的东西应该可以帮助你开始

    var weeks = new[]
    {
        new {Year = 2014, Week = 52},
        new {Year = 2015, Week = 1},
        new {Year = 2015, Week = 2},
    };
    var listWithEmptyWeeksIncluded = 
        from w in weeks
        from l in list.Where(x => x.Year == w.Year && x.Week == w.Week).DefaultIfEmpty()
        select new TrendRecord
                    {
                        Year = w.Year,
                        Week = w.Week,
                        Count = l == null ? 0 : l.Count
                    };

当然,周应该根据变量startend 生成

此外,您应该使用标准的周计算,例如ISO周标准,以便正确处理跨越两年的周。