ASP.NET Загрузка страницы таблицы CORE MVC занимает слишком много времени

#asp.net-mvc #asp.net-core #entity-framework-core

#asp.net-mvc #asp.net-core #entity-framework-core

Вопрос:

У меня есть таблица с заказами (около 8000 записей), загрузка таблицы занимает несколько секунд.

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

при удалении этой функции таблица загружается быстро.

При загрузке записей я использую Skip и Take, но при получении названия продукта я повторяю все заказы, поскольку, если пользователь захочет выполнить поиск по названию продукта, он покажет все результаты с этим продуктом.

Таблица продуктов невелика (около 70 записей)

Я не могу понять, почему функция делает загрузку страницы такой медленной.

Я знаю, что могу просто добавить столбец product name в таблицу и заполнять его при добавлении новых заказов, но это звучит неправильно,

Кто-нибудь может сказать мне причину этой задержки?

Функция returnProductName :

 public string returnProductName(int productId)
  {
   return (_unitOfWork.Product.GetAll().Where(q => q.Id == productId).Select(q => 
           q.ProductName)).FirstOrDefault();
  }
 

Функция, которая загружает данные страницы:

     [HttpPost]
    public ActionResult GetList()
    {
        //Server Side parameters
        int start = Convert.ToInt32(Request.Form["start"].FirstOrDefault());
        int length = Convert.ToInt32(Request.Form["length"].FirstOrDefault());
        string searchValue = Request.Form["search[value]"].FirstOrDefault();
        string sortColumnName = Request.Form["columns[" Request.Form["order[0][column]"] "][name]"].FirstOrDefault();
        string sortDirection = Request.Form["order[0][dir]"].FirstOrDefault();
        List<Order> orderList = new List<Order>();
            orderList = _unitOfWork.Order.GetAll().ToList();//Working Fast
        int totalRows = orderList.Count;
        foreach (Order order in orderList)
        {
            order.ProductName = returnProductName(order.ProductId);
         }
        if (!string.IsNullOrEmpty(searchValue))
        {
            orderList = orderList.Where(x => x.FullAddress.ToLower().Contains(searchValue.ToLower())
                                        x.Id.ToString().Contains(searchValue.ToLower()) ||
                                        x.OrderStatus.ToLower().Contains(searchValue.ToLower()) ||
                                        x.ProductName.ToLower().Contains(searchValue.ToLower()) |||
                                        x.Quantity.ToString().Contains(searchValue.ToLower()) ||
                                        x.Cost.ToString().Contains(searchValue.ToLower()) ||
                                        (!string.IsNullOrEmpty(x.TrackingNumber)  amp;amp; x.TrackingNumber.ToString().Contains(searchValue.ToLower()))
            ).ToList<Order>();
        }
        int totalRowsAfterFiltering = orderList.Count;
        orderList = orderList.Skip(start).Take(length).ToList<Order>();
        return Json(new { data = orderList, draw = Request.Form["draw"], recordsTotal = totalRows ,
                    recordsFiltered = totalRowsAfterFiltering});
    }
 

Ответ №1:

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

В этом случае GetAllById() , а затем обновление returnProductName , которое я бы переименовал в GetProductName() :

 
// Or whatever your type is
public Dictionary<int, List<Product>> GetAllById()
{
   // your code..

   return data
      .GroupBy(x => x.Id)
      .ToDictionary(x => x.Key, x => x.ToList());
}

 
 
public string GetProductName(int productId)
{
   var products = _unitOfWork.Product.GetAllById();

   return products[productId].FirstOrDefault(q => q.ProductName);
}