[英]C# Linq How to enumerate over time periods between two dates to get data for a graph
我有一个在某些日期发生的事件表,我知道我想格式化数据以便能够随着时间的推移绘制事件的折线图。 数据有一个标签,它是 x 轴上的值,而 data 是 y 轴上的值。
数据应该在两个日期之间,在这个例子中是从和到,然后它必须在天的时间间隔内
这是我的第一次尝试。
var graphData = bookings.Where(x => x.DateCreated > from && x.DateCreated < to)
.GroupBy(x => new { x.DateCreated.Year, x.DateCreated.Month, x.DateCreated.Day })
.OrderBy(x => x.Key.Year).ThenBy(x => x.Key.Month).ThenBy(x => x.Key.Day)
.Select(x => new GraphData
{
Label = x.Key.Day + "/" + x.Key.Month + "/" + x.Key.Year,
Data = x.Count()
}).ToList();
这为我提供了正确的数据来绘制图表,但仅适用于创建任何事件的日子。
我想将没有发生任何事情的日子的数据包含在我的图表中,以便我可以在同一图表上比较不同类型的事件。
我想出了这个解决方案
var dateRanges = Enumerable.Range(0, 1 + to.Value
.Subtract(from.Value).Days)
.Select(offset => from.Value.AddDays(offset)).ToList();
var graphData = dateRanges.Select(day => new GraphData()
{
Label = day.ToString("D"),
Data = bookings.Count(x => x.DateCreated.Date == day.Date)
}).ToList();
这似乎非常低效。
有什么办法可以通过 linq 查询做到这一点,这样我就不必对每个日期进行计数?
您尝试的问题在于它会针对您的每个日期对数据库进行一次查询。 而是执行一次查询以获取包含数据的日期,然后将其与内存中的日期范围合并。
var dbData = bookings.Where(x => x.DateCreated > from && x.DateCreated < to)
.GroupBy(x => x.DateCreated.Date)
.Select(grp => new { grp.Key, grp.Count() })
.ToDictionary(x => x.Key, x => x.Count);
var graphData = Enumerable.Range(0, 1 + to.Value.Date.Subtract(from.Date.Value).Days)
.Select(offset => from.Value.Date.AddDays(offset))
.Select(day => new GraphData()
{
Label = day.ToString("D"),
Data = dbDate.TryGetValue(day, out var count) ? count : 0
}).ToList();
还要确保在计算中使用Date
,因为“1-1-2017 23:00:00”和“1-2-2017 00:00:00”之间的差异不到一天,因此您的范围最终会只是“1-1-2017”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.