Compiled Queries: LINQ-Abfragen mit Pegasus-Stiefeln © msg systems ag, August 20121 Gordon Breuer...

Post on 06-Apr-2015

105 views 2 download

Transcript of Compiled Queries: LINQ-Abfragen mit Pegasus-Stiefeln © msg systems ag, August 20121 Gordon Breuer...

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