2009-10-06 3 views
0

У нас есть небольшая партнерская программа и простой инструмент для просмотра статистики филиалов.Результаты кэширования агрегирования в 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*/) 

Где каждый раз под названием ищет кэшированные значения. Но я скептически отношусь к тому, что это будет очень эффективно?

ответ

1

Может быть, это полезно для вас:

Caching LinqToSql results with SqlCacheDependency

+0

Для того, чтобы использовать уведомления о запросах (базовую технологию SqlCacheDependency см http://rusanu.com/2006/06/17/the- mysterious-notification /) запрос должен удовлетворять критериям http://msdn.microsoft.com/en-us/library/ms181122.aspx. Единственные агрегаты, принятые ar COUNT_BIG и SUM, и они должны удовлетворять некоторым дополнительным ограничениям. –

Смежные вопросы