Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在获取每日计数时,如何在LINQ查询中显示零计数?_Linq_Group By_Time Series - Fatal编程技术网

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

在获取每日计数时,如何在LINQ查询中显示零计数?,linq,group-by,time-series,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,

我有一个带有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() }; var minDate=DateTime.Now.AddMonths(-3); var stats=从TestStats中的t开始 其中t.Date>minDate 按EntityFunctions对t进行分组。截断时间(t.Date)为g orderby g.Key 选择新的 { 日期=g.键, count=g.count() }; 这很好,但问题是,如果一天没有记录,那么这一天根本不在结果中。例如:

3/21/2008 = 5 3/22/2008 = 2 3/24/2008 = 7 3/21/2008 = 5 3/22/2008 = 2 3/24/2008 = 7
在这个简短的例子中,我想使
3/23/2008=0
。在实际查询中,所有的零应该显示在3个月前和今天之间。

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

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()
}).ToList();  // hydrate so we only query the DB once

var firstDate = stats.Min(s => s.date);
var lastDate = stats.Max(s => s.date);

var allDates = Enumerable.Range(1,(lastDate - firstDate).Days)
                         .Select(i => firstDate.AddDays(i-1));

stats = (from d in allDates
        join s in stats 
            on d equals s.date into dates
        from ds in dates.DefaultIfEmpty()
        select new {
            date = d,
            count = ds == null ? 0 : ds.count
        }).ToList();

你也可以得到一个不在数据中的日期列表,并将它们连接起来。

我同意@D Stanley的回答,但想在组合中加入额外的考虑因素。你用这些数据做什么?来电者正在处理吗?它是在UI中呈现的吗?它是通过网络传输的吗

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

如果要在UI中循环渲染数据,那么为什么需要间隙?为什么不实现从min date到max date的循环(如D Stanley的join),然后在找不到值时放置默认值

如果你在一个网络上传输,你仍然需要一个单独的集合,考虑在斯坦利的另一边应用D的分辨率。


只是要考虑的事情…

LINQ到对象?我想不是(
EntityFunctions
)。应该是LINQ to SQL,请相应地更新标记。我认为它与SQL方法非常相似,并且非常容易实现。但是您不会通过Linq尝试,而是必须构造并执行原始SQL。此解决方案提供了一个很好的折衷方案,突出了利用SQL和内存处理的能力。