Performance, Performance, Performance! Wenn es auch bei euch darum geht die Geschwindigkeit einer Code-Pasage zu verbessern und ihr der Meinung seit, dass es eigentlich nicht mehr schneller geht, solltet ihr nicht vergessen eure Linq-Queries vorzukompilieren. Die Klasse CompiledQuery aus dem Namespace System.Data.Objects ist hierzu das nötige Helferlein.
Die generische Methode Compile der Klasse kann dazu verwendet werden um ein einfaches Linq-Query vorzukompilieren damit es zur Laufzeit performanter ausgeführt werden kann. Die Methode stellt genügend Überladungen bereit um die meisten Bedürfnisse abzudecken.
Eine Übersicht aller Überladungen der Methode findet Ihr hier.
Die Verwendung der Methode ist denkbar einfach, wie das nachfolgende Beispiel zeigt
1: // Ausgangscode
2: var products = from p in myContext.Products
3: where p.CategoryId = '1'
4: select p
Zunächst definiert man eine Variable die das vorkompilierte Query speichern soll
1: Func<MyObjectContext, String, IQueryable<Product>> getProductsById;
Nun kommt die Zuweisung und die eigentliche Vorkompilierungsanweisung
1: getProductsById =
2: CompiledQuery.Compile<MyObjectContext, String, IQueryable<Products>>
3: ((MyObjectContext context, String filterCondition)
4: => from p in context.Products
5: where p.CategoryId = filterCondition
6: select p);
Zum Schluss noch ein Beispiel für die spätere Verwendung des vorkompilierten Queries
1: // alle Produkte der Kategorie 4 abrufen
2: var products =
3: getProductsById.Invoke(MyRepository.Context, "4");
Mit diesen einfachen Schritten kann man die Ausführung von Linq Queries beschleunigen und somit nochmals an der Code-Performance bzw. Anwendungsperformance schrauben.