【问题标题】:Get Records count of specified date-range from database, if no record present for one of the date then return count as '0'从数据库中获取指定日期范围的记录计数,如果其中一个日期不存在记录,则返回计数为“0”
【发布时间】:2018-12-21 02:18:28
【问题描述】:

我想要指定日期范围的数据库记录列表(包含 HoursCount 和日期)

如果某个日期的记录在数据库中不可用,那么该日期应该在 count = 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 日,数据库中没有记录。在这种情况下,List 还应包含 15-Dec-2018,TotalHoursCount = 0

【问题讨论】:

  • 您可能希望向我们展示您的应用程序的正确部分。 GetDateWiseUsage 肯定必须返回正确的数据吗?即使你想改变API方法,我们也不知道AppUsageGraph是什么类型。
  • 感谢约翰提供详细信息。我已经编辑了问题,是否有助于低估我的问题陈述
  • 您能否也包括 GetDateWiseUsage 方法,并且基本上包括数据库查询在内的任何地方?
  • 嘿约翰,我已经删除了不需要的方法,并在代码下面添加了一些额外的描述,希望这有助于理解实际问题...
  • 您可能需要为缺失的日期生成一个日期范围,并将其与您的其余数据整合。

标签: c# linq date


【解决方案1】:

您应该创建一些虚拟数据来填补空白。由于您正在执行Sum,因此您可以创建一些输入数据的虚拟对象。

为此,我假设 SetList&lt;SourceData&gt; - 根据需要进行更改:

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

可以之后添加虚拟数据,但事先这样做似乎更容易/更少工作。

【讨论】:

    猜你喜欢
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    相关资源
    最近更新 更多