Ich versuche, ein Caching-Schema für mein EF-Repository zu implementieren, ähnlich dem Blogged hier . Wie der Autor und die Kommentatoren berichtet haben, besteht die Einschränkung darin, dass die Schlüsselgenerierungsmethode keine Cacheschlüssel erzeugen kann, die mit den Parametern einer bestimmten Abfrage variieren. Hier ist die Cache-Schlüsselgenerierungsmethode:
%Vor%Die folgenden Abfragen ergeben also den gleichen Cache-Schlüssel:
%Vor%und
%Vor% Beachten Sie, dass der einzige Unterschied darin besteht, dass isActive = true
in der ersten Abfrage und isActive = false
in der zweiten Abfrage enthalten sind.
Alle Vorschläge / Erkenntnisse zur effizienten Generierung von Cacheschlüsseln, die sich um IQueryable
-Parameter unterscheiden, wären wirklich willkommen.
Lob an Sergey Barskiy für die Freigabe des EF CodeFirst Caching-Schemas.
Ich habe den Ansatz verfolgt, den Ausdrucksbaum von IQueryable selbst zu durchlaufen, um die Werte der in der Abfrage verwendeten Parameter aufzulösen. Mit dem Vorschlag von maxlego habe ich die System.Linq.Expressions.ExpressionVisitor Klasse, um die Expression-Knoten zu besuchen, an denen wir interessiert sind - in diesem Fall die MemberExpression . Die aktualisierte GetKey
-Methode sieht etwa so aus:
Und die Klasse QueryParameterVisitor
, die von den Antworten von Bryan Watts Marc Gravell zu diesem Frage , sieht so aus:
Ich mache immer noch einige Leistungsprofile auf die Cache-Schlüsselgenerierung und hoffe, dass es nicht zu teuer ist (ich werde die Frage mit den Ergebnissen aktualisieren, sobald ich sie habe). Ich lasse die Frage offen, für den Fall, dass jemand Vorschläge zur Optimierung dieses Prozesses hat oder eine Empfehlung für eine effizientere Methode zum Generieren von Cache-Schlüsseln mit unterschiedlichen Abfrageparametern hat. Obwohl diese Methode die gewünschte Ausgabe erzeugt, ist sie keineswegs optimal.
Nur für das Protokoll, Zwischenspeichern der Ergebnisse von LINQ-Abfragen "funktioniert gut mit der EF und es ist in der Lage, mit Parametern richtig zu arbeiten, so dass es als eine gute Second-Level-Cache-Implementierung für EF betrachtet werden kann.
Während die Lösung des OP recht gut funktioniert, habe ich festgestellt, dass die Leistung der Lösung ein wenig schlecht ist.
Die Dauer der Schlüsselgenerierung variierte zwischen 300ms
und 1200ms
für meine Abfragen.
Allerdings habe ich eine andere Lösung gefunden, die eine bessere Leistung hat ( <10ms
).
Tags und Links entity-framework caching ef-code-first iqueryable repository