Linq Group按周数包括0个记录周

时间:2014-10-29 20:22:14

标签: c# linq reporting-services

我试图获取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>(); 

我已经查看了thisthis这些问题,但似乎都不适合我的困境。

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

这是解决这个问题的可接受方法(请告诉我如何处理)?有没有办法在一个查询中执行此操作,而无需单独的列表加入?

1 个答案:

答案 0 :(得分:1)

您需要一个周列表,并使用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周标准,以便正确处理跨越两年的周。