2009-10-06 66 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
+0

爲了能夠使用查詢通知(的SqlCacheDependency的底層技術,看http://rusanu.com/2006/06/17/the- mysterious-notification /)查詢必須滿足http://msdn.microsoft.com/en-us/library/ms181122.aspx上的條件。唯一的聚合接受了COUNT_BIG和SUM,他們必須滿足一些額外的限制。 – 2009-10-06 16:40:09