SQL-запросы в Entity Framework

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" означает, что каждая запись имеет тип "Country".

Также можно использовать параметризованный запрос (перегруженная версия метода "SqlQuery"smile:

// Не забываем подключить 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.

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *