Question

Nous venons de commencer à utiliser LINQ to SQL au travail pour notre DAL et nous n'avons pas vraiment trouvé de norme pour le modèle de mise en cache.Auparavant, nous utilisions une classe de base « DAL » qui implémentait une propriété de gestionnaire de cache dont toutes nos classes DAL héritées, mais maintenant nous ne l'avons plus.Je me demande si quelqu'un a mis au point une approche « standard » pour mettre en cache les résultats LINQ to SQL ?

Nous travaillons dans un environnement Web (IIS) si cela fait une différence.Je sais que cela pourrait bien finir par être un subjectif question, mais je pense toujours que l'information serait précieuse.

MODIFIER: Pour clarifier, je ne parle pas de mettre en cache un résultat individuel, je recherche plutôt une solution d'architecture, comme comment configurer la mise en cache afin que toutes vos méthodes de lien utilisent la même architecture de mise en cache.

Était-ce utile?

La solution

Une réponse rapide :Utilisez le modèle Repository (voir Domain Driven Design par Evans) pour récupérer vos entités.Chaque référentiel mettra en cache les éléments qu'il contiendra, idéalement en permettant à chaque instance du référentiel d'accéder à un cache singleton (chaque thread/requête instanciera un nouveau référentiel mais il ne peut y avoir qu'un seul cache).

La réponse ci-dessus ne fonctionne que sur une seule machine.Pour pouvoir l'utiliser sur de nombreuses machines, utilisez memcaché comme solution de mise en cache.Bonne chance!

Autres conseils

Mon Cache des résultats de requête LINQ est probablement exactement ce que vous recherchez.

var q = from c in context.Customers
        where c.City == "London"
        select new { c.Name, c.Phone };

var result = q.Take(10).FromCache();

Pierre.

C'est juste sous ton nez :

List<TableItem> myResult = (from t in db.Table select t).ToList();

Maintenant, mettez simplement en cache myResult comme vous auriez mis en cache les données renvoyées par votre ancien DAL.

j'ai trouvé ce post, qui propose une méthode d'extension comme moyen de mettre en cache les objets LINQ.

Je me suis cogné la tête contre le mur pour les faibles en essayant maintenant de trouver une bonne solution de mise en cache pour Linq2SQL, et je dois admettre que j'ai vraiment du mal à trouver une solution universelle...

Le modèle de référentiel a tendance à limiter l'utilité de Linq, car (sans réimplémenter IQueryable) la mise en cache doit être effectuée en dehors de l'instruction Linq.

De plus, le chargement différé et le suivi des objets sont tous deux à éviter si vous souhaitez mettre vos objets en cache, ce qui rend les mises à jour un peu plus délicates.

Quiconque a réussi à résoudre ce problème dans le cadre d'un projet Web hautement concurrent, veuillez intervenir et sauver le monde !:)

Je comprends que c'est peut-être une réponse un peu tardive...Néanmoins, vous pouvez essayer le LinqToCache projet.Il accroche une SqlDepdency à une requête LINQ arbitraire, si possible, et fournit une invalidation du cache actif via les notifications de requête côté serveur.Les requêtes doivent être des requêtes valides pour les notifications, voir Création d'une requête pour la notification.La plupart des requêtes Linq-to-sql sont conformes à ces restrictions, à condition que les tables soient spécifiées à l'aide de noms en deux parties (dbo.Table, pas seulement Table).

Voir la méthode « GetReferenceData » dans la classe « ReferenceData » dans Cet article: http://blog.huagati.com/res/index.php/2008/06/23/application-architecture-part-2-data-access-layer-dynamic-linq/

Il utilise le cache de pages asp.net pour mettre en cache les données récupérées à l'aide de L2S.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top