Compiled Queries: LINQ-Abfragen mit Pegasus-Stiefeln Gordon Breuer IT Consultant & Software Engineer Travel & Logistics 1 © msg systems ag, August 2012 Die Inhalte Das Problem Compiled Queries Demo! 2 Die Theorie © msg systems ag, August 2012 Wo / Wie entsteht das Problem 3 © msg systems ag, August 2012 Wo und wie entsteht der Performance-Engpass? LINQ λ (Lambda) ExpressionTree SQL 4 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%' © msg systems ag, August 2012 Wo und wie entsteht der Performance-Engpass? LINQ λ (Lambda) ExpressionTree SQL 5 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%' © msg systems ag, August 2012 Compiled Queries als Lösung 6 © msg systems ag, August 2012 Compiled Queries • Verfügbar seit .NET 3.5 • Namensraum System.Data.Linq • Statische Klasse CompiledQuery • Compile<TArg0, …, TResult>( Expression<Func<TArg0, …, TResult>>) 7 © msg systems ag, August 2012 Compiled Queries • 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 8 © msg systems ag, August 2012 Instanzen vs. Statische Klassen • Aufruf in instanziierten Klassen? • Statischer Kontext! 9 © msg systems ag, August 2012 Die Vorteile Die Vor- und Nachteile im Überblick 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 Nachteile 10 Deutlicher Geschwindigkeitszuwachs bei oft aufgerufenen Abfragen © msg systems ag, August 2012 Tipps zur Verwendung • Alle Compiled Queries in einer eigenen statischen Klasse sammeln • Es muss immer der gleiche DataKontext verwendet werden • Das zurückgegebene one-time Enumerable in eine Liste umwandeln 11 © msg systems ag, August 2012 Demos in Visual Studio 12 © msg systems ag, August 2012 Vielen Dank für Ihre Aufmerksamkeit Gordon Breuer IT Consultant // Software Engineer msg systems ag Robert-Bürkle-Straße 1 85737 Ismaning/München Telefon: E-Mail: +49 160 9091 5143 [email protected] Twitter: Facebook: Blog: @anheledir http://facebook.com/gordon.breuer http://gordon-breuer.de Telefon: +49 89 96101-0 Fax: +49 89 96101-1113 [email protected] www.msg-systems.com www.msg-systems.com 13 © msg systems ag, Mai 2012