Entity Framework 4 - SQL-Abfragen direkt ausführen
Es gibt Situationen da ist es praktischer, wenn ein SQL–Befehl direkt zur Datenquelle gesendet werden kann, ohne ein Umweg über Linq und der Auswertung des Expression Tree’s, um eine Liste von Entitäten zu erhalten. In einigen Situationen kann diese Vorgehensweise auch den Einsatz der Compiled Queries ersparen.
Im EF1 können Abfragen indirekt über Store Procedures ausgeführt und mithilfe des Funktionsimportes über den Objektkontext bereitgestellt werden. Das Problem können hier jedoch Richtlinien sein, die den Einsatz von gespeicherten Prozeduren nicht gestatten, auf der anderen Seite füllt sich der Objektkontext mit Methoden.
Um hier die Flexibilität zu verbessern, gibt es neu die Methoden "ExecuteStoreQuery", die eine Rückgabe von Entitäten erlaubt und "ExecuteStoreCommand" mit der Abfragen ohne Rückgabewerte ausgeführt werden können. Diese Funktionalität ist von Linq to SQL abgeleitet und kann auch genauso verwendet werden. Anwendung kann es zum Beispiel finden, wenn eine selbst erstellte SQL-Abfrage besser läuft, als das vom Entity Framework generierte SQL. In meinem Beispiel möchte ich alle Mandanten abfragen, die mehr als 400 Pläne verwalten. Mit "ExecuteStoreQuery" habe ich folgende Möglichkeit dies zu erreichen:
C# public ListGetPremiumMandators() { this.context.ex int minPlanCount = 400; var result = this.context.ExecuteStoreQuery (@" SELECT * -- Stern nicht in produktiven Anwendungen nutzen! FROM tbMandator WHERE maAutoID IN ( SELECT buMandatorAutoID FROM tbPlan INNER JOIN tbProduct ON tbProduct.prAutoID = tbPlan.plProductAutoID INNER JOIN tbBusinessUnit ON tbBusinessUnit.buAutoID = tbProduct.prBusinessUnitAutoID GROUP BY buMandatorAutoID HAVING COUNT(plAutoId) > {0} )", minPlanCount); return result.ToList(); } T-SQL exec sp_executesql N' SELECT * -- Stern nicht in produktiven Anwendungen nutzen!!! FROM tbMandator WHERE maAutoID IN ( SELECT buMandatorAutoID FROM tbPlan INNER JOIN tbProduct ON tbProduct.prAutoID = tbPlan.plProductAutoID INNER JOIN tbBusinessUnit ON tbBusinessUnit.buAutoID = tbProduct.prBusinessUnitAutoID GROUP BY buMandatorAutoID HAVING COUNT(plAutoId) > @p0 )',N'@p0 int',@p0=400
Die T-SQL Ausgabe zeigt auch, dass die Abfrage parametrisiert wurde. Daraus ergeben sich folgende Vorteile:
- Schutz vor SQL-Injection
- Die Abfrage wird in den Ausführungscache abgelegt, was beim erneuten Ausführen Analyse- und Kompilierzeit erspart
Trotzdem "sollte" diese Art des Einsatzes nicht zu exzessiv betrieben werden. Zudem ist zu prüfen, ob der Kernbestandteil einer Abfrage in einer Sicht auf der Datenbank gehalten werden kann, sodass auch der Datenbankadministrator die Möglichkeit der Optimierung erhält.
- 0 Kommentar(e)


Mein Kommentar