Wir haben vor kurzem begonnen, kompilierte Abfragen zu verwenden, um die Leistung unserer Linq to SQL-Einrichtung zu verbessern. Es gibt mehrere Abfragen, die beim ersten Mal mehrere Sekunden benötigen, bei späteren Durchläufen aber weniger als eine Sekunde. Dies scheint daran zu liegen, dass die Kompilierung erst dann erfolgt, wenn der Aufruf zum ersten Mal gemacht wird.
Gibt es eine einfache Möglichkeit, diese Kompilierung während der Kompilierung des Programms oder zumindest während des Starts zu erzwingen?
EDIT: Aus den Kommentaren, die ich sehe, sieht es so aus, dass Linq-Abfragen definitiv nicht kompiliert werden, bis der Aufruf erfolgt. Richtig jetzt ich schreibe meine Abfragen wie diese:
static readonly Func<DataContext, int, IQueryable<Item>> getByPLUComp =
CompiledQuery.Compile<DataContext, int, IQueryable<Item>>((db, PLU) =>
from i in db.Items
where i.IntPLU == PLU && i.Terminated == null
select i);
Ich habe einen Haufen dieser statischen readonly Funcs im Umlauf. Gibt es eine einfache Möglichkeit, wie ich mein Programm herumlaufen lassen kann und sie beim Start initialisieren, so dass die Kosten dort und nicht während der regelmäßigen Verwendung entstehen?
EDIT 2: Ein letzter Versuch, bevor ich diese Frage aufgebe. Um dieses Problem zu beheben, habe ich einfach Aufrufe zu den kompilierten Abfragen während der Initialisierung meines Programms hinzugefügt. Zum Beispiel:
public void Initialize()
{
DataContext db = new DataContext();
getByPLUComp(db, 0);
}
Gibt es einen eleganteren Weg, um die Kompilierung zu erzwingen, ohne einfach die Abfrage auszuführen und die Ergebnisse zu verwerfen?