我要求在一个范围内的每一天从查询返回结果,即使数据库没有结果。
我可以为此做一些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();
}
答案 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()
,这是一个更好的选择。