2009-10-06 64 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