Post on 06-Apr-2015
1
Compiled Queries: LINQ-Abfragen mit Pegasus-Stiefeln
© msg systems ag, August 2012
Gordon Breuer
IT Consultant & Software Engineer
Travel & Logistics
2 © msg systems ag, August 2012
Compiled Queries
Das Problem
Die TheorieDemo!
Die Inhalte
3 © msg systems ag, August 2012
Wo / Wie entsteht das Problem
4 © msg systems ag, August 2012
LINQ
λ(Lambda)
Expression-Tree
SQL
Wo und wie entsteht der Performance-Engpass?
IEnumerable<Customer> linq = from customer in db.Customer where customer.LastName.StartsWith("B")select customer;
IQueryable<Customer> lambda = db.Customer.Where(customer => customer.LastName.StartsWith("B"));
Expression<Func<Customer, bool>> bedingung =s => s.LastName.StartsWith("B");
IQueryable<Customer> lambda = db.Customer.Where(bedingung);
SELECT * FROM Customer WHERE LastName = 'B%'
Magic
5 © msg systems ag, August 2012
LINQ
λ(Lambda)
Expression-Tree
SQL
Wo und wie entsteht der Performance-Engpass?
IEnumerable<Customer> linq = from customer in db.Customer where customer.LastName.StartsWith("B")select customer;
IQueryable<Customer> lambda = db.Customer.Where(customer => customer.LastName.StartsWith("B"));
Expression<Func<Customer, bool>> bedingung =s => s.LastName.StartsWith("B");
IQueryable<Customer> lambda = db.Customer.Where(bedingung);
SELECT * FROM Customer WHERE LastName = 'B%'
6 © msg systems ag, August 2012
Compiled Queries als Lösung
7 © msg systems ag, August 2012
• Verfügbar seit .NET 3.5
• Namensraum System.Data.Linq
• Statische Klasse CompiledQuery• Compile<TArg0, …, TResult>(Expression<Func<TArg0, …, TResult>>)
Compiled Queries
8 © msg systems ag, August 2012
• 1. Parameter = Objekt-Kontext für den Datenzugriff
• Letzter Parameter (n) = Rückgabewert
• 2. - (n-1). Parameter = Optionale Übergabeparameter
• In .NET 3.5 und Silverlight: Überladungen für bis zu drei
Übergabeparameter
• In .NET 4.0+: Überladungen für bis zu 15
Übergabeparameter
• Sollten mehr gebraucht werden: Helferklasse
Compiled Queries
9 © msg systems ag, August 2012
• Aufruf in instanziierten Klassen?
• Statischer Kontext!
Instanzen vs. Statische Klassen
10 © msg systems ag, August 2012
Deutlicher Geschwindigkeitszuwachs bei oft aufgerufenen Abfragen
Anfänglicher Overhead wirkt sich bei wenigen Aufrufen negativ auf die Performance aus.Höherer Speicherverbrauch durch Zwischenspeichern der Funktionen.Schlechtere Lesbarkeit des Quellcodes.
Die Vorteil
e
Die Nacht
eile
Die Vor- und Nachteile im Überblick
11 © msg systems ag, August 2012
• Alle Compiled Queries in einer eigenen statischen Klasse sammeln
• Es muss immer der gleiche Data-Kontext verwendet werden
• Das zurückgegebene one-time Enumerable in eine Liste umwandeln
Tipps zur Verwendung
12 © msg systems ag, August 2012
Demos in Visual Studio
13
www.msg-systems.com
Vielen Dank für Ihre Aufmerksamkeit
© msg systems ag, Mai 2012
Gordon BreuerIT Consultant // Software Engineer
Telefon: +49 160 9091 5143E-Mail: gordon.breuer@msg-systems.de
Twitter: @anheledirFacebook: http://facebook.com/gordon.breuerBlog: http://gordon-breuer.de
msg systems ag
Robert-Bürkle-Straße 185737 Ismaning/München
Telefon: +49 89 96101-0Fax: +49 89 96101-1113info@msg-systems.com
www.msg-systems.com
eure