我要从数据库中获取记录列表(包含HoursCount和日期)以指定日期范围
如果某个日期的记录在数据库中不可用,则该日期应在计数为0的列表中
// Where GetDateWistUsage is...
public List<GraphData> GetDateWiseUsage(DateTime startDate, DateTime endDate)
{
return Set.Where(x => x.Date >= startDate.Date && x.Date < endDate.Date)
.GroupBy(x => x.Date)
.Select(x => new GraphData { Date = x.Key.Date, TotalHoursCount = x.Sum(i => i.TotalHours }).ToList();
}
// Where GraphData is
public class GraphData
{
public DateTime Date { get; set; }
public double TotalHoursCount { get; set; }
}
在这里,假设我们将日期2018年12月1日传递到2018年12月20日,而对于2018年12月15日,数据库中没有记录。在这种情况下,列表还应包含2018年12月15日且TotalHoursCount = 0
答案 0 :(得分:0)
您应该创建一些虚拟数据来填补空白。由于您要进行Sum
,因此您只需为输入数据创建一些虚拟变量即可。
为此,我假设Set
是List<SourceData>
-必要时进行更改:
public class SourceData
{
public DateTime Date { get; set; }
public long TotalHours { get; set; }
}
public class GraphData
{
public DateTime Date { get; set; }
public long TotalHoursCount { get; set; }
}
然后,我添加了一种获取日期范围(上限不包括上限)的方法:
public static IEnumerable<DateTime> GetDateRange(DateTime startDate, DateTime endDate)
{
return Enumerable.Range(0, (endDate - startDate).Days).Select(d => startDate.AddDays(d));
}
最后,我更新了您的GetDataWiseUsage方法以生成日期范围并将其转换为虚拟源数据:
public static List<GraphData> GetDateWiseUsage(DateTime startDate, DateTime endDate)
{
return Set.Where(x => x.Date >= startDate.Date && x.Date < endDate.Date)
.Concat(GetDateRange(startDate, endDate).Select(date => new SourceData() { Date = date, TotalHours = 0 }))
.GroupBy(x => x.Date.Date)
.Select(x => new GraphData { Date = x.Key, TotalHoursCount = x.Sum(i => i.TotalHours) }).ToList();
}
我已将您的代码更改为按x.Date.Date
而不是x.Date
进行分组,因为您似乎希望每天进行单独的分组,而不是按唯一的时间进行分组。分组依据不会将虚拟数据与真实数据分组,并将其分解为总和。
您可以在之后添加虚拟数据 ,但是事前似乎更容易/省力。