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 List GetPremiumMandators()
{
  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

Über jeden weiteren Kommentar in diesem Post benachrichtigen.

Zurück

Translate this page

Kategorien

  • [-].NET Development (215)
  • [-]Datenbank (26)
  • HTML (1)
  • Konfiguration (12)
  • Mind Map (10)
  • Off-topic (9)
  • Open Source (3)
  • Qualität (7)
  • Sharepoint (6)
  • Sicherheit (2)

Archiv

Social Bookmarking

Bookmark bei: Mr. Wong Bookmark bei: Webnews Bookmark bei: Icio Bookmark bei: Oneview Bookmark bei: Linkarena Bookmark bei: Favoriten Bookmark bei: Seekxl Bookmark bei: Favit Bookmark bei: Social Bookmarking Tool Bookmark bei: Power Oldie Bookmark bei: Bookmarks.cc Bookmark bei: Newskick Bookmark bei: Newsider Bookmark bei: Linksilo Bookmark bei: Readster Bookmark bei: Folkd Bookmark bei: Yigg Bookmark bei: Digg Bookmark bei: Del.icio.us Bookmark bei: Reddit Bookmark bei: Simpy Bookmark bei: StumbleUpon Bookmark bei: Slashdot Bookmark bei: Netscape Bookmark bei: Furl Bookmark bei: Yahoo Bookmark bei: Spurl Bookmark bei: Google Bookmark bei: Blinklist Bookmark bei: Blogmarks Bookmark bei: Diigo Bookmark bei: Technorati Bookmark bei: Newsvine Bookmark bei: Blinkbits Bookmark bei: Ma.Gnolia Bookmark bei: Smarking Bookmark bei: Netvouz Information