Entity Framework Core Tutorial Необработанные SQL-запросы
Вступление
Entity Framework Core позволяет вам выполнять необработанные запросы SQL непосредственно к базе данных, где вы не можете использовать LINQ для представления запроса, если сгенерированный SQL недостаточно эффективен. EF Core предоставляет метод DbSet.FromSql()
для выполнения необработанных SQL-запросов.
using (var context = new MyContext()) { var customers = context.Customers .FromSql("SELECT * FROM dbo.Customers") .ToList(); }
В приведенном выше примере необработанный запрос SQL указывается в FromSql()
который возвращает все записи из таблицы Customers и преобразуется в сущности Customer.
Передача параметров
Как и в случае любого API, который принимает SQL, важно параметризировать любой пользовательский ввод для защиты от атаки SQL-инъекцией. Метод DbSet.FromSql()
также поддерживает параметризованные запросы с использованием синтаксиса строковой интерполяции в C #.
using (var context = new MyContext()) { var customers = context.Customers .FromSql("Select * from dbo.Customers where LastName = '{0}'", firstName) .ToList(); }
Операторы LINQ
Вы также можете использовать операторы LINQ после необработанного запроса, используя FromSql()
.
using (var context = new MyContext()) { var customers = context.Customers .FromSql("Select * from dbo.Customers where FirstName = 'Andy'") .OrderByDescending(c => c.Invoices.Count) .ToList(); }
Ограничения
В Entity Framework Core есть некоторые ограничения, поэтому убедитесь, что вы знаете их при использовании необработанных запросов SQL.
- Запрос SQL, указанный в
FromSql()
должен возвращать данные для всех свойств типа сущности. - Имена столбцов в наборе результатов должны совпадать с именами столбцов, которым сопоставляются свойства.
- Запрос SQL не может содержать связанные данные, вы можете составить его поверх запроса, используя оператор Include для возврата связанных данных.
- Предоставленный SQL будет обрабатываться как подзапрос, убедитесь, что переданный SQL не должен содержать символов или опций, которые недопустимы в подзапросе, таких как конечная точка с запятой и т. Д.
- Операторы SQL, отличные от SELECT, автоматически распознаются как несложные. Как следствие, полные результаты хранимых процедур всегда возвращаются клиенту, и все операторы LINQ, применяемые после FromSql, оцениваются в памяти.