获取每日计数时如何在LINQ查询中显示零计数?

时间:2016-09-12 19:03:40

标签: linq group-by time-series

我有一个带有datetime列的数据库表,我只想计算每天有多少记录可以追溯到3个月。我目前正在使用此查询:

var minDate = DateTime.Now.AddMonths(-3);

var stats = from t in TestStats
where t.Date > minDate
group t by EntityFunctions.TruncateTime(t.Date) into g
orderby g.Key
select new
{
   date = g.Key,
   count = g.Count()
};

工作正常,但问题是如果一天没有记录,那么那天根本就不在结果中。例如:

3/21/2008 = 5
3/22/2008 = 2
3/24/2008 = 7

在那个简短的例子中,我想制作3/23/2008 = 0。在真实查询中,所有零都应显示在3个月前和今天之间。

2 个答案:

答案 0 :(得分:1)

在SQL中构建缺少的数据并不简单。我建议在SQL中获取 的数据,然后将其加入到所有相关日期的内存列表中:

5.2

您还可以获取不在数据中的日期列表并将它们连接起来。

答案 1 :(得分:0)

我同意@D Stanley的回答,但是想要进一步考虑混合。你在用这些数据做什么?它是由调用者处理的吗?它是在UI中呈现的吗?它是通过网络传输的吗?

考虑数据的大小。为什么 需要 填补空白?例如,如果知道通过网络返回,我建议不要填补空白。您所做的只是增加数据大小。这必须序列化,转移,然后反序列化。

如果要将数据循环到UI中进行渲染,那么为什么需要这些差距呢?为什么不实现从最小日期到最大日期的循环(如D Stanley的连接),然后在没有找到值时设置默认值。

如果您通过网络转移并且仍然需要一个集合,请考虑在电线的另一侧应用D Stanley的分辨率。

需要考虑的事情......