2009-10-06 4 views
0

Nous avons un petit programme d'affiliation et un outil simple pour afficher les statistiques des affiliés.Mise en cache des résultats agrégés dans Linq2SQL

LINQ pour montrer le rapport:

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 
    ... 
} 

Lorsque le calcul de EnquiryCount et EnquiryOrderSum prend le temps de plus en plus plus que la base de données est de plus en plus. (Les index sont définis, je le promets). Une idée consiste à mettre EnquiryCount et EnquiryOrderSum en cache dans une table de sepparate et à recalculer ces valeurs toutes les heures et toutes les nuits.

Est-il possible (dans linq2sql/asp.net) de mettre en cache de manière générique ces résultats sans créer de tables/colonnes statiques pour chaque propriété?

Je pense à la création de quelque chose comme:

EnquiryCount = Cache(g => (int?)e.CampaignCodes.Sum(f => f.Enquiries.Count()) ?? 0, 3600000 /*ms lifetime*/, e.Id/*key*/, "AffiliateService.EnquiryCount"/*property*/) 

Où chaque fois appelé recherche une des valeurs mises en cache. Mais je suis sceptique que ce sera très efficace?

Répondre

1

Peut-être que ce qui est utile pour vous:

Caching LinqToSql results with SqlCacheDependency

+0

Pour être utiliser Query Notifications (la __gVirt_NP_NN_NNPS<__ technologie sous-jacente de SqlCacheDependency, voir http://rusanu.com/2006/06/17/the- mysterious-notification /) une requête doit satisfaire aux critères sur http://msdn.microsoft.com/fr-fr/library/ms181122.aspx. Les seuls agrégats acceptés sont COUNT_BIG et SUM et ils doivent satisfaire certaines restrictions supplémentaires. –

Questions connexes