按范围内的所有日期分组

时间:2015-01-29 16:58:54

标签: c# entity-framework linq-to-entities

我要求在一个范围内的每一天从查询返回结果,即使数据库没有结果。

我可以为此做一些groupBy技巧,还是我必须将我的结果合并到预先生成的空结果列表中?

编辑: 到目前为止,我所有的都是查询,以获取每天的汇总结果(有结果)(略微修改以删除公司数据,所以我希望它仍然有意义!)

 public List<MetricsResult> GetReport(DateTime toDate, DateTime fromDate)
    {
        var results =
            context.Histories.Where(
                history => (DbFunctions.TruncateTime(history.Sent) <= DbFunctions.TruncateTime(fromDate) &&
                            DbFunctions.TruncateTime(history.Sent) >= DbFunctions.TruncateTime(toDate)))
                .GroupBy(h => DbFunctions.TruncateTime(h.Sent))
                .Select(histories => new MetricsResult
                {
                    Sent = histories.Count(f => f.Sent != null),
                    Unsubscribed = histories.Count(f => f.Unsubscribed.HasValue),
                    Day = histories.Key
                });

        return results.ToList();
    }

1 个答案:

答案 0 :(得分:2)

如果您执行以下操作,请使用linq to objects

var days = Enumerable.Range(0, (toDate - fromDate).TotalDays)
    .Select(i => fromDate.Date.AddDays(i));

你将获得你所在范围内的每一天。

然后,如果你得到你的结果,而是做,

var lookup = results.ToDictionary(mr => mr.Day, mr);

然后就可以了,

var newResults = days.Select(day =>
    {
        if (lookup.ContainsKey(day))
        {
            return lookup[day];
        }
        else
        {
            return new MetricsResult
                {
                    Day = day
                };  
        }
    }).ToList();

并避免再次访问您的数据库。


如果您需要结果为IQueryable,这是一个不同的命题,但由于我在您的代码中看到ToList(),这是一个更好的选择。