我试图获取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>();
我已经查看了this和this这些问题,但似乎都不适合我的困境。
我倾向于在开始日期和结束日期之间创建一个包含所有可能的周数的列表,然后以某种方式将我的数据加入其中,以便显示有0条记录的周数。
这是解决这个问题的可接受方法(请告诉我如何处理)?有没有办法在一个查询中执行此操作,而无需单独的列表加入?
答案 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
};
当然,应根据您的变量start
和end
此外,您应该使用标准周计算,例如ISO周标准,以便正确处理跨越两年的周。