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执行某种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
};
当然,周应该根据变量start
和end
生成
此外,您应该使用标准的周计算,例如ISO周标准,以便正确处理跨越两年的周。