Führen Sie eine native SQL-Abfrage in Entity Framework Core aus
Entity Framework Core bietet die Methode DbSet.FromSql (), mit der SQL-Rohabfragen für die zugrunde liegende Datenbank ausgeführt und die Ergebnisse als Entitätsobjekte abgerufen werden können.
Das folgende Beispiel zeigt, wie eine SQL-Rohabfrage für die MS SQL Server-Datenbank ausgeführt wird.
var context = new SchoolContext();
var students = context.Students
.FromSql("Select * from Students where Name = 'Bill'")
.ToList();
Im obigen Beispiel wird die FromSql () -Methode nach dem Student-Entitätssatz (DbSet <Student>) verwendet, sodass die angegebene SQL-Abfrage einen Datensatz aus der Student-Tabelle zurückgeben muss, der in die Student-Entität konvertiert wird. Entity Framework Core führt die angegebene Abfrage in der Datenbank aus, dh wählen Sie im obigen Beispiel * von Student mit * Name = 'Bill' aus.
Parametrisierte Abfrage
Die FromSql-Methode ermöglicht parametrisierte Abfragen mithilfe der String-Interpolationssyntax in C # (siehe unten).
string name = "Bill";
var context = new SchoolContext();
var students = context.Students
.FromSql($"Select * from Students where Name = '{name}'")
.ToList();
The following is also valid.
string name = "Bill";
var context = new SchoolContext();
var students = context.Students
.FromSql("Select * from Students where Name = '{0}'", name)
.ToList();
Im obigen Beispiel wird die folgende SQL-Abfrage in der SQL Server-Datenbank ausgeführt:
exec sp_executesql N'Select * from Students where Name = ''@p0''
',N'@p0 nvarchar(4000)',@p0=N'Bill'
go
LINQ-Operator
Sie können den LINQ-Operator auch nach der ursprünglichen Abfrage mit der FromSql-Methode verwenden.
string name = "Bill";
var context = new SchoolContext();
var students = context.Students
.FromSql("Select * from Students where Name = '{0}'", name)
.OrderBy(s => s.StudentId)
.ToList();
Im obigen Beispiel führt EF Core die folgende Abfrage durch, indem die FromSql-Methode und der OrderBy-Operator kombiniert werden.
exec sp_executesql N'SELECT [s].[StudentId], [s].[Name]
FROM (
Select * from Students where Name = ''@p0''
) AS [s]
ORDER BY [s].[StudentId]',N'@p0 nvarchar(4000)',@p0=N'Bill'
go
Einschränkungen von FromSql
Die SQL-Abfrage muss Entitäten des gleichen Typs wie DbSet <T> zurückgeben. Wenn Sie beispielsweise FromSql nach einem Schüler verwenden, kann die angegebene Abfrage die Kursentität nicht zurückgeben. Der von der FromSql () -Methode zurückgegebene temporäre Typ befindet sich in der Aufgabenliste.
Die SQL-Abfrage muss alle Spalten der Tabelle zurückgeben. Beispiel: context.Students.FromSql ("StudentId, Nachname von Schülern auswählen). ToList () löst eine Ausnahme aus. Die
SQL-Abfrage kann keine JOIN-Abfrage enthalten, um verwandte Daten abzurufen. Verwenden Sie nach der FromSql () -Methode die Include-Methode, um verwandte Entitäten zu laden.