У нас есть небольшая партнерская программа и простой инструмент для просмотра статистики филиалов.Результаты кэширования агрегирования в Linq2SQL
Linq для отображения отчета:
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*/)
Где каждый раз под названием ищет кэшированные значения. Но я скептически отношусь к тому, что это будет очень эффективно?
Для того, чтобы использовать уведомления о запросах (базовую технологию SqlCacheDependency см http://rusanu.com/2006/06/17/the- mysterious-notification /) запрос должен удовлетворять критериям http://msdn.microsoft.com/en-us/library/ms181122.aspx. Единственные агрегаты, принятые ar COUNT_BIG и SUM, и они должны удовлетворять некоторым дополнительным ограничениям. –