Generieren von Cache-Schlüsseln von IQueryable zum Zwischenspeichern von Ergebnissen erster EF-Code-Abfragen

8

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.

Aktualisieren

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:

%Vor%

Und die Klasse QueryParameterVisitor , die von den Antworten von Bryan Watts Marc Gravell zu diesem Frage , sieht so aus:

%Vor%

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.

    
HOCA 26.11.2011, 02:37
quelle

3 Antworten

1

Ich schlage vor, ExpressionVisitor zu verwenden Ссылка

    
maxlego 28.11.2011 23:01
quelle
1

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.

    
VahidN 09.06.2012 07:14
quelle
1

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

%Vor%     
flash 29.05.2013 07:55
quelle