繁体   English   中英

C# Linq 如何枚举两个日期之间的时间段以获取图表数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM