Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Mit Entity Framework können Sie LINQ mit Ihren Entitätsklassen abfragen. Es kann jedoch vorkommen, dass Sie Abfragen mit rohem SQL direkt für die Datenbank ausführen möchten. Dazu gehören das Aufrufen gespeicherter Prozeduren, die für Code First-Modelle hilfreich sein können, die derzeit keine Zuordnung zu gespeicherten Prozeduren unterstützen. Die in diesem Thema gezeigten Techniken gelten gleichermaßen für Modelle, die mit Code First und EF Designer erstellt wurden.
Schreiben von SQL-Abfragen für Entitäten
Die SqlQuery-Methode für DbSet ermöglicht das Schreiben einer rohen SQL-Abfrage, die Entitätsinstanzen zurückgibt. Die zurückgegebenen Objekte werden vom Kontext genauso nachverfolgt wie bei der Rückgabe durch eine LINQ-Abfrage. Beispiel:
using (var context = new BloggingContext())
{
var blogs = context.Blogs.SqlQuery("SELECT * FROM dbo.Blogs").ToList();
}
Beachten Sie, dass die Abfrage wie bei LINQ-Abfragen erst ausgeführt wird, wenn die Ergebnisse aufgezählt werden – im obigen Beispiel erfolgt der Aufruf von ToList.
Achten Sie darauf, wann immer unformatierte SQL-Abfragen aus zwei Gründen geschrieben werden. Zunächst sollte die Abfrage geschrieben werden, um sicherzustellen, dass nur Entitäten zurückgegeben werden, die wirklich vom angeforderten Typ sind. Wenn Sie beispielsweise Features wie Vererbung verwenden, ist es einfach, eine Abfrage zu schreiben, die Entitäten erstellt, die den falschen CLR-Typ aufweisen.
Zweitens stellen einige Typen von rohen SQL-Abfragen potenzielle Sicherheitsrisiken offen, insbesondere bei SQL-Einfügungsangriffen. Stellen Sie sicher, dass Sie Parameter in Ihrer Abfrage auf die richtige Weise verwenden, um vor solchen Angriffen zu schützen.
Laden von Entitäten aus gespeicherten Prozeduren
Sie können DbSet.SqlQuery verwenden, um Entitäten aus den Ergebnissen einer gespeicherten Prozedur zu laden. Der folgende Code ruft zum Beispiel die Prozedur dbo.GetBlogs in der Datenbank auf.
using (var context = new BloggingContext())
{
var blogs = context.Blogs.SqlQuery("dbo.GetBlogs").ToList();
}
Sie können parameter auch mithilfe der folgenden Syntax an eine gespeicherte Prozedur übergeben:
using (var context = new BloggingContext())
{
var blogId = 1;
var blogs = context.Blogs.SqlQuery("dbo.GetBlogById @p0", blogId).Single();
}
Schreiben von SQL-Abfragen für Nicht-Entitätstypen
Eine SQL-Abfrage, die Instanzen eines beliebigen Typs zurückgibt, einschließlich primitiver Typen, kann mithilfe der SqlQuery-Methode in der Database-Klasse erstellt werden. Beispiel:
using (var context = new BloggingContext())
{
var blogNames = context.Database.SqlQuery<string>(
"SELECT Name FROM dbo.Blogs").ToList();
}
Die ergebnisse, die von SqlQuery on Database zurückgegeben werden, werden niemals vom Kontext nachverfolgt, auch wenn es sich bei den Objekten um Instanzen eines Entitätstyps handelt.
Senden von unformatierten Befehlen an die Datenbank
Befehle, die keine Abfragen sind, können mithilfe der ExecuteSqlCommand-Methode an die Datenbank gesendet werden. Beispiel:
using (var context = new BloggingContext())
{
context.Database.ExecuteSqlCommand(
"UPDATE dbo.Blogs SET Name = 'Another Name' WHERE BlogId = 1");
}
Beachten Sie, dass alle Änderungen, die an Daten in der Datenbank mithilfe von ExecuteSqlCommand vorgenommen wurden, für den Kontext undurchsichtig sind, bis Entitäten aus der Datenbank geladen oder neu geladen werden.
Ausgabeparameter
Wenn Ausgabeparameter verwendet werden, sind ihre Werte erst verfügbar, wenn die Ergebnisse vollständig gelesen wurden. Dies liegt an dem zugrunde liegenden Verhalten von DbDataReader, weitere Details finden Sie unter Abrufen von Daten mithilfe eines DataReader .