Добавление недостающих дат в JSON, у которых не было продаж - PullRequest
0 голосов
/ 12 октября 2018

У меня есть фрагмент кода, который возвращает результат JSON, как показано ниже:

 return JsonConvert.SerializeObject(allData.OrderBy(x => x.DataDate.Value.Date)
                                           .Select(item =>
                                                   new { Date = item.DataDate.Value.ToString("yyyy-MM-dd"), 
                                                         Sales = (int)item.SalesForDay,  
                                                         Revenue = (int?)item.RevenueForDay.Value }));

Как видно из приведенного выше, строка кода возвращает все даты, когда были продажи ...

Например, график будет иметь:

10th of October - 3 Sales - Revenue 1100$

8th of October - 3 Sales - Revenue 1100$

4th of October - 3 Sales - Revenue 1100$

2nd of October - 3 Sales - Revenue 1100$

1st of October - 3 Sales - Revenue 1100$

В возвращенном операторе должны быть возвращены все даты с текущей даты (12 октября) за последние 30 дней, в которых не было ПРОДАЖ, а также должен быть 0,00 доход за эти даты....

Как мне этого добиться?

Может ли кто-нибудь мне помочь?

1 Ответ

0 голосов
/ 12 октября 2018

Вот индивидуальное решение для вашей проблемы.Хотя я знаю, что это не лучшее решение, но оно решит вашу задачу.

Во-первых, создайте DTO

public class SalesDataDTO
{
    public DateTime Date { get; set; }
    public int Sales { get; set; }
    public int Revenue { get; set; }
}

Во-вторых, скопируйте эту служебную функцию

public IEnumerable<DateTime> EachDay(DateTime from, DateTime thru)
{
    for (var day = from.Date; day.Date <= thru.Date; day = day.AddDays(1))
        yield return day;
}

Наконец, вызовите эту функцию, чтобы получить желаемый результат:

public List<SalesDataDTO> GetReportData()
{
    // 1. Define date range
    DateTime fromDate = DateTime.Now.Date;
    DateTime toDate = DateTime.Now.Date.AddDays(-30);

    // 2. create object to store final result
    List<SalesDataDTO> saleDataList = new List<SalesDataDTO>();

    // 3. create basic data
    foreach (DateTime day in EachDay(fromDate, toDate))
    {
        saleDataList.Add(new SalesDataDTO { Date = day });
    }

    // 4. get actual data from db
    List<SalesDataDTO> actualReportData = allData.OrderBy(x => x.DataDate.Value.Date)
                                .Select(item =>
                                    new SalesDataDTO
                                    {
                                     Date = item.DataDate.Value.ToString("yyyy-MM-dd"),
                                     Sales = (int)item.SalesForDay,
                                     Revenue = (int?)item.RevenueForDay.Value
                                    }); 

    // 5. a bit customization
    saleDataList.ForEach(record =>
    {
        var actualData = actualReportData.FirstOrDefault(x => x.Date.Date == record.Date.Date);
        if (actualData != null)
        {
            record.Sales = actualData.Sales;
            record.Revenue = actualData.Revenue;
        }
    });

    // 6. return data
    return saleDataList;
}

Позже вы можете использовать JsonConvert.SerializeObject(saleDataList); для дальнейшей сериализации ваших данных.

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