Как эффективно получить много данных в моем приложении asp .NET?C#

Место общения программистов C#
Ответить
Anonymous
 Как эффективно получить много данных в моем приложении asp .NET?

Сообщение Anonymous »

И спасибо, что обратили внимание на мою проблему.
Я пытаюсь создать панель мониторинга, которая отображает все важные данные в команде (созданные продажи, потерянные продажи, средний ответ и т. д.).
И так далее. Контроллер. Я получаю все выбранные данные в своей базе данных 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();

}
Кстати, мой помощник FindRelatedRequestId предназначен для просмотра объекта, связанного с одной строкой (я знаю, что это:

Код: Выделить всё

        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;
}
Код выполняется и извлекается так, как я ожидал, но в моем случае это слишком большой объем данных. Моему компьютеру может потребоваться более 900 секунд, чтобы получить все. Я знаю, что время загрузки на сервере намного быстрее, но это все равно свидетельствует об отсутствии оптимизации.
Я предполагаю, что эта проблема в первую очередь связана со всеми вызовами базы данных. Вместо вызова всех объектов в одной инструкции, все вызывается один за другим. Я искал решение, но ничего не нашел.
Второе решение, которое я нашел, — это создать кеш и хранить данные в кеше, но у меня в голове есть некоторые ошибки: как чтобы кэш развивался и масштабировался по мере того, как программа видит новые и некэшированные данные каждый раз, когда вызывается этот метод?
Если вы спрашиваете, почему я этим занимаюсь, я младший разработчик приложение, и я совершенно один в команде, занимающейся разработкой этого приложения, я не работаю в среде программирования, поэтому мой код не проверяется другим человеком (я в очень конкретном случае). Версия ASP .NET — 2.0 (я знаю, что она очень старая).
Сейчас я пытаюсь сформировать данные, чтобы удалить моего помощника, создав внешний ключ PRODUCT_ID, Я знаю, что этот метод не упрощает проблему.
Если у вас есть какая-нибудь подсказка, которая меня просветит, я буду очень рад ее прочитать.
Еще раз спасибо, что обратили внимание на мою проблему


Подробнее здесь: https://stackoverflow.com/questions/790 ... fficiently
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»