#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);
}