Получить количество записей указанного диапазона дат из базы данных, если нет записей на одну из дат, а затем вернуть счетчик как «0» - PullRequest
0 голосов
/ 21 декабря 2018

Я хочу, чтобы список (содержащий 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; }
}

Здесь предположим, что если мы передаем дату с 1 декабря 2018 года по 20 декабря 2018 года, а для 15 декабря 2018 года в базе данных нет записей.В этом случае список также должен содержать 15 декабря 2018 года с TotalHoursCount = 0

1 Ответ

0 голосов
/ 21 декабря 2018

Вы должны создать несколько фиктивных данных, чтобы заполнить пробелы.Поскольку вы делаете 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, так как кажется, что вы хотите отдельную группировку в день, а не по уникальнойвремя.Группировка по не сгруппирует фиктивные данные с реальными данными, а разложит их в сумму.

Вы могли бы добавить фиктивные данные впоследствии , но это кажется проще/ меньше работы, чтобы сделать это заранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...