Как я могу заполнить массив записями с помощью запроса с использованием столбца DateTime и переменных месяцев, лет - PullRequest
0 голосов
/ 23 декабря 2018

Я работаю над созданием интернет-магазина и предоставляю администраторам возможность просматривать данные в диаграмме с помощью ChartJs, ASP.NET Core Razor Pages для просмотра.Чтобы показать данные с помощью графика, я использую jQuery для изменения данных с графика без обновления страницы, поэтому мне нужно, чтобы данные уже загружались, когда пользователь находится на странице.

Сейчас я застрялв той части, где я получаю свой список ключей в массив.Я получаю все данные из моей таблицы «Ключ» со столбцом DateTime, отформатированным как «19-12-2018 18:46:34» (день-месяц-год-часы-минуты-секунды) и из 8 других столбцов, не имеющих отношенияна DateTime

Что я хочу получить: для 2016–2019 годов дни каждого месяца Ниже приведен пример кода, который работает для указанного года и месяца

Я использую страницы Razor с MVVM-pattern
Это с моей страницы с выделенным кодом, где я загружаю данные, которые я буду использовать для просмотра этой страницы для Chart.js.

public List<Key>[] AllOrdersDays { get; set; }
AllOrdersDays = new List<Key>[31];

for (int day = 0; day < 32; day++)
{
AllOrdersDays[day] = (from key in _context.Key
                      where key.OrderDate.Year == 2018 && key.OrderDate.Month == 12 &&  key.OrderDate.Day == day
                      select key).ToList();
}

Это отлично работает, но я не хочуписать это снова и снова за каждый месяц, начиная с 2016 года и до 2019 года

public List<Key>[] AllOrdersDays { get; set; }
public async Task OnGetAsync()
{
    AllOrdersDays = new List<Key>[10000];
    for (int year = 2016; year < 2019; year++)
    {
         for (int month = 1; month < 12; month++)
         {
             for (int day = 0; day < 32; day++)
             {
                 AllOrdersDays[day] = (from key in _context.Key
                                       where key.OrderDate.Year == year && key.OrderDate.Month == month && key.OrderDate.Day == day+1
                                       select key).ToList();
             }
         }
     }
 }

Это всего лишь фрагмент из моей страницы, где я оставил всю ненужную информацию.OnGetAsync () вызывается, когда пользователь переходит на страницу.new List [10000] 10000 - это просто значение, потому что его нужно было заполнить в массиве для инициации.

В результате я получаю, что первые 31 запись получат правильное значение, но после того, как будет выброшено исключение NullReferenceExceptionчто я понимаю, потому что «день» во вложенном цикле for никогда не превысит 31, поэтому массив может заполнять данные только за 1 месяц.

То, что я хотел бы знать, - это способ заставить эту работу работать.,Возможно, это не самое элегантное решение, но я не хочу жестко кодировать свои проблемы.

1 Ответ

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

Вместо этого, которое не будет работать правильно, поскольку не каждый месяц имеет одинаковое количество дней (хотя это можно легко обойти), вы можете просто получить список по датам, сгруппировав по датезаказ.

var data = _context.Key
    .Where(key => key.OrderDate.Year > 2015)
    .GroupBy(key => key.OrderDate)
    .SelectMany(grp => new OrdersByDate 
    {
        // the date of the orders
        Date = grp.Key,
        // the list of orders for the date
        Orders = grp.ToList()
    })
    .ToList();

Это даст вам все заказы по дате.Если вам нужно разделить год, месяц и день, вы можете сделать это в классе OrdersByDate, который я создал в качестве образца:

public class OrdersByDate
{
    public DateTime Date { get; set; }
    public List<Key> Orders { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...