从数据库中获取指定日期范围内的记录计数,如果某一日期中没有记录,则将计数返回为“ 0”

时间:2018-12-21 02:18:29

标签: c# linq date

我要从数据库中获取记录列表(包含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

1 个答案:

答案 0 :(得分:0)

您应该创建一些虚拟数据来填补空白。由于您要进行Sum,因此您只需为输入数据创建一些虚拟变量即可。

为此,我假设SetList<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进行分组,因为您似乎希望每天进行单独的分组,而不是按唯一的时间进行分组。分组依据不会将虚拟数据与真实数据分组,并将其分解为总和。

可以在之后添加虚拟数据 ,但是事前似乎更容易/省力。