Я пытаюсь создать панель мониторинга, которая отображает все важные данные в команде (созданные продажи, потерянные продажи, средний ответ и т. д.).
И так далее. Контроллер. Я получаю все выбранные данные в своей базе данных mysql, чтобы отобразить их на моем представлении, чтобы отобразить это с помощью Chart.js.
Мой код для получения данных выглядит следующим образом:
Код: Выделить всё
public async Task Charts()
{
int thisMonth= DateTime.Today.Month;
int thisYear= DateTime.Today.Year;
var rdhTable = _context.RequestDateHistory.Where(rdh=>rdh.Date.Year ==thisYear) ;
var productDtos = new Dictionary();
foreach (var rdh in rdhTable)
{
int productId = await FindRelatedRequestId(rdh.RequestName);
if (productId == 0) continue;
ProductModel product = await _context.ProductModel
.Include(p =>p.User)
.Include(p=> p.RequestModel.CountryModel)
.FirstAsync(p => p.ID ==productId);
if (product != null && !productDtos.ContainsKey(productId))
{
productDtos.Add(productId,new ProductChartsDto
{
ID = product.ID,
Type_Enum= product.Type_Enum,
Name = product.Name,
TemporaryName = product.Temporary_Name,
SacManager = product.User_Sac,
FactoryId = product.FACTORY_ID,
Country = product.RequestModel.CountryModel.Name
}) ;
}
}
//var userIdToUserName = await _context.Users.ToDictionaryAsync(u => u.Id, u => u.FirstName + ' ' + u.LastName);
var requestData =await rdhTable
.GroupBy(rdh => rdh.Date.Month)
.Select(group => new
{
Month = group.Key,
CreatedRequests = group.Count(rdh => rdh.StatusID == 1),
LostRequests = group.Count(rdh => rdh.StatusID == 21),
Agreements = group.Count(rdh => rdh.StatusID == 5),
Delivered = group.Count(rdh => rdh.StatusID == 17),
})
.ToListAsync();
Dictionary monthLabels = new Dictionary();
foreach(var data in requestData)
{
monthLabels.Add(data.Month, CultureInfo.InvariantCulture.DateTimeFormat.GetMonthName(data.Month));
}
ViewBag.MonthLabels = monthLabels;
ViewBag.CreatedRequestsDict = requestData.ToDictionary(key => key.Month, value => value.CreatedRequests);
ViewBag.LostRequestsDict = requestData.ToDictionary(key => key.Month, value => value.LostRequests);
ViewBag.AgreementsDict = requestData.ToDictionary(key => key.Month, value => value.Agreements);
ViewBag.DeliveredDict = requestData.ToDictionary(key => key.Month, value => value.Delivered);
// Get and sort Enum type counts so far this year
var enumTypeCounts= productDtos.Where(p=> p.Value.Type_Enum != null)
.GroupBy(p=> p.Value.Type_Enum)
.ToDictionary(p=> p.Key,p=> p.Count());
// Get and sort Products count by SAC User so far this year
var sacWorkload = productDtos.Where(p => p.Value.SacUser != null)
.GroupBy(p => p.Value.SacUser)
.Select(g => new {
Name = g.Key.FirstName+' '+g.Key.LastName ,
Count = g.Count() })
.ToDictionary(x => x.Name, x => x.Count);
var ordersByCountry = productDtos
.GroupBy(p => p.Value.Country)
.ToDictionary(x => x.Key, x => x.Count());
ViewBag.ProductTypeCounts = enumTypeCounts;
ViewBag.SacWorkload = sacWorkload;
ViewBag.OrdersByCountry = ordersByCountry;
return View();
}
Код: Выделить всё
private async Task FindRelatedRequestId(string requestName)
{
var nameSplitted = requestName.Split('/');
string productName = nameSplitted.Length > 1 ? nameSplitted[1] : requestName;
var product = await _context.ProductModel
.FirstOrDefaultAsync(p => p.Name == productName || p.Temporary_Name == productName);
var productId = product?.ID ?? 0;
return productId;
}
Я предполагаю, что эта проблема в первую очередь связана со всеми вызовами базы данных. Вместо вызова всех объектов в одной инструкции, все вызывается один за другим. Я искал решение, но ничего не нашел.
Второе решение, которое я нашел, — это создать кеш и хранить данные в кеше, но у меня в голове есть некоторые ошибки: как чтобы кэш развивался и масштабировался по мере того, как программа видит новые и некэшированные данные каждый раз, когда вызывается этот метод?
Если вы спрашиваете, почему я этим занимаюсь, я младший разработчик приложение, и я совершенно один в команде, занимающейся разработкой этого приложения, я не работаю в среде программирования, поэтому мой код не проверяется другим человеком (я в очень конкретном случае). Версия ASP .NET — 2.0 (я знаю, что она очень старая).
Сейчас я пытаюсь сформировать данные, чтобы удалить моего помощника, создав внешний ключ PRODUCT_ID, Я знаю, что этот метод не упрощает проблему.
Если у вас есть какая-нибудь подсказка, которая меня просветит, я буду очень рад ее прочитать.
Еще раз спасибо, что обратили внимание на мою проблему
Подробнее здесь: https://stackoverflow.com/questions/790 ... fficiently
Мобильная версия