У нас есть небольшая партнерская программа и простой инструмент для просмотра партнерской статистики.
Линк для отображения отчета:
from e in linq0
select new
{
Id = e.Id,
Name = e.CompanyName,
EnquiryCount = (int?)e.CampaignCodes.Sum(f => f.Enquiries.Count()) ?? 0,
EnquiryOrderSum = (int?)e.CampaignCodes.Sum(f => (int?)f.Enquiries.Sum(g => (int?)g.Orders.Sum(h => h.OrderPrice) ?? 0) ?? 0) ?? 0
...
}
Там, где вычисление EnquiryCount и EnquiryOrderSum занимает все больше времени по мере роста базы данных. (Индексы определены, обещаю).
Одна из идей состоит в том, чтобы кэшировать EnquiryCount и EnquiryOrderSum в отдельную таблицу и пересчитывать их каждый час или каждую ночь.
Есть ли способ (в linq2sql / asp.net) для общего кэширования этих результатов без создания статических таблиц / столбцов для каждого из них надлежащим образом?
Я думаю о создании чего-то вроде:
EnquiryCount = Cache(g => (int?)e.CampaignCodes.Sum(f => f.Enquiries.Count()) ?? 0, 3600000 /*ms lifetime*/, e.Id/*key*/, "AffiliateService.EnquiryCount"/*property*/)
Где каждый раз вызываемый ищет кэшированные значения. Но я скептически отношусь к тому, что это будет очень эффективно?