SQL-запросы в Entity Framework
Всем доброго времени суток. На связи Алексей Гулынин. Продолжаем работать с LINQ To Entities. В данной статье я бы хотел рассказать про прямое выполнение SQL-запросов в Entity Framework. В классе контекста данных ("DBContext"), от которого мы постоянно наследуемся, имеется свойство "Database", которым мы и воспользуемся.
Хочу обратить ваше внимание на то, что в статье, в ключевых словах SQL используется вместо английской "E" русская "Е". Я сделал так для того, чтобы получилось добавить статью (сервер блокировал добавление в базу данных). Срабатывание происходит на команды добавления, обновления и удаления записей. Если будете копировать код, то перепишите данные слова.
Для выполнения SQL-запроса используем метод SqlQuery. Данный метод в качестве параметра использует строку запроса:
var result1 = db.Database.SqlQuery<Country>("SELECT * FROM Countries"); foreach (var obj in result1) { Console.WriteLine("Название страны: {0} | Население: {1}", obj.Name, obj.Population); }
Запросом "SELECT * FROM Countries" мы получаем все записи из таблицы "Countries". Запись "SqlQuery
Также можно использовать параметризованный запрос (перегруженная версия метода "SqlQuery":
// Не забываем подключить using System.Data.SqlClient SqlParameter param = new SqlParameter("@population", 70000000); var result1 = db.Database.SqlQuery<Country>("SELECT * FROM Countries WHERE Population < (@population)", param); foreach (var obj in result1) { Console.WriteLine("Название страны: {0} | Население: {1}", obj.Name, obj.Population); }
В данном примере мы получаем все страны с численностью населения меньше 70 млн. человек.
Давайте теперь поговорим о том, как добавлять новые записи, обновлять или удалять уже существующие.
Для этого используется метод ExecuteSqlCommand(), который возвращает количество строк, которые были затронуты запросом
Давайте на примере рассмотрим, как это работает:
// Добавляем новую страну Console.WriteLine("Добавляем новую страну..."); int insertedRow = db.Database.ExecuteSqlCommand("INSERT INTO Countries (Name, Population) VALUЕS ('Italy','61000000')"); Console.WriteLine("Затронуто строк: {0}", insertedRow); Console.WriteLine("Затронуто строк: {0}", insertedRow); var result1 = db.Database.SqlQuery<Country>("SELECT * FROM Countries"); foreach (var obj in result1) { Console.WriteLine("Название страны: {0} | Население: {1}", obj.Name, obj.Population); } // Обновляем запись // Изменим численность населения в Италии int updatedRow = db.Database.ExecuteSqlCоmmаnd("UPDATЕ Countries SЕT Population = '60500000' WHERE Name = 'Italy'"); Console.WriteLine("Затронуто строк: {0}", updatedRow); // Удаляем запись int deletedRow = db.Database.ExecuteSqlCommand("DЕLЕTЕ FROM Countries WHERE Name = 'Italy'"); Console.WriteLine("Затронуто строк: {0}", updatedRow);
Под хайдом приведу весь код:
Класс "Country":
class Country { // id страны public int Id { get; set; } // Название страны public string Name { get; set; } // Численность населения public long Population { get; set; } }
Строка подключения будет иметь следующий вид:
<connectionStrings> <add name="MyEFDB" connectionString="data source=(LocalDb)\v11.0;initial catalog=MyEFDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /> </connectionStrings>
Класс "MyEFDB" (контекст) будет иметь следующий вид:
using System.Data.Entity; namespace TestProject { class MyEFDB: DbContext { public MyEFDB(): base("name=MyEFDB") { } public virtual DbSet<Country> Countries { get; set; } } }
Основной код:
using System; using System.Data.Entity; using System.Data.SqlClient; using System.Collections.Generic; using System.Linq; namespace TestProject { class Program { static void Main(string[] args) { Database.SetInitializer(new DropCreateDatabaseAlways<MyEFDB>()); using (MyEFDB db = new MyEFDB()) { // Добавим снова наши 5 стран List<Country> countriesList = new List<Country> { new Country { Name = "Russia", Population = 145000000}, new Country { Name = "France", Population = 67000000}, new Country { Name = "Germany", Population = 82000000}, new Country { Name = "England", Population = 53000000}, new Country { Name = "Spain", Population = 46000000} }; db.Countries.AddRange(countriesList); db.SaveChanges(); // Добавляем новую страну Console.WriteLine("Добавляем новую страну..."); int insertedRow = db.Database.ExecuteSqlCommand("INSЕRT INTO Countries (Name, Population) VALUЕS ('Italy','61000000')"); Console.WriteLine("Затронуто строк: {0}", insertedRow); var result1 = db.Database.SqlQuery<Country>("SELECT * FROM Countries"); foreach (var obj in result1) { Console.WriteLine("Название страны: {0} | Население: {1}", obj.Name, obj.Population); } // Обновляем запись // Изменим численность населения в Италии int updatedRow = db.Database.ExecuteSqlCommand("UPDATЕ Countries SЕT Population = '60500000' WHERE Name = 'Italy'"); Console.WriteLine("Затронуто строк: {0}", updatedRow); // Удаляем запись int deletedRow = db.Database.ExecuteSqlCommand("DЕLЕTЕ FROM Countries WHERE Name = 'Italy'"); Console.WriteLine("Затронуто строк: {0}", updatedRow); } Console.WriteLine("Нажмите клавишу для продолжения..."); Console.ReadLine(); } } }
В данной статье вы узнали про прямое выполнение SQL-запросов в Entity Framework.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.