LINQ Join

LINQ Join

Всем доброго времени суток. На связи Алексей Гулынин. Продолжаем работать с LINQ To Entities. В данной статье я бы хотел рассказать о методе Join() в LINQ. В SQL оператор JOIN используется для объединения нескольких таблиц для последующего извлечения информации из них. Давайте на примере рассмотрим, как выбирать данные из нескольких таблиц. Продолжаем работать с нашими странами и столицами.

Создадим класс "Country":

class Country
{
  // id страны
  public int Id { get; set; }
  // Название страны
  public string Name { get; set; }
}

Класс "Capital":

class Capital
{
  // id столицы
  public int Id { get; set; }
  // название столицы
  public string Name { get; set; }
  // id страны
  public int CountryID { get; set; }
}

Класс "MyEFDB" будет иметь следующий вид:

using System.Data.Entity;

namespace TestProject
{
  class MyEFDB: DbContext
  {
    public MyEFDB(): base("name=MyEFDB")
    { }
    public virtual DbSet<Country> Countries { get; set; }
    public virtual DbSet<Capital> Capitals { 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>

Добавим данные в таблицу, создав несколько объектов обоих классов. Данные будем выводить в формате "Название страны : столица". Для возможности объединения таблицы должны иметь общее поле. В нашем случае будем объединять по "id" страны. В таблице "Countries" — это поле "Id", в "Capitals" — "CountryID".

Основной код:

using System;
using System.Data.Entity;
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 { Id = 1, Name = "Russia"},
          new Country { Id = 2, Name = "France"},
          new Country { Id = 3, Name = "Germany"},
          new Country { Id = 4, Name = "England"},
          new Country { Id = 5, Name = "Spain"}
        };
        db.Countries.AddRange(countriesList);
        // Добавим столицы
        List<Capital> capitalsList = new List<Capital>
        {
          new Capital { Name = "Paris", CountryID = 2},
          new Capital { Name = "Madrid", CountryID = 5},
          new Capital { Name = "London", CountryID = 4},
          new Capital { Name = "Moscow", CountryID = 1},
          new Capital { Name = "Berlin", CountryID = 3}
        };
        db.Capitals.AddRange(capitalsList);
        db.SaveChanges();
        // Метод Join()
        // Здесь мы Countries объединяем с Capitals
        // по полям country.Id (первая таблица) и capital.CountryID (вторая таблица)
        var result = db.Countries.Join(db.Capitals,
                        country => country.Id,
                        capital => capital.CountryID,
                        // результат, который будет храниться в переменной result
                        (country, capital) => new
                        {
                          // Имя страны
                          countryName = country.Name,
                          // Имя столицы
                          capitalName = capital.Name
                        });
        // Выводим информацию
        Console.WriteLine("Результат 1:");
        foreach (var obj in result)
        {
          Console.WriteLine("{0} : {1}", obj.countryName, obj.capitalName);
        }

        // Оператор join
        var result2 = from country in db.Countries
                      join capital in db.Capitals
                      on country.Id equals capital.CountryID
                      select new { countryName = country.Name, capitalName = capital.Name };
        // Выводим информацию
        Console.WriteLine("Результат 2:");
        foreach (var obj2 in result2)
        {
          Console.WriteLine("{0} : {1}", obj2.countryName, obj2.capitalName);
        }
      }
      Console.WriteLine("Нажмите клавишу для продолжения...");
      Console.ReadLine();
    }
  }
}

Лично для меня второй вариант кажется более наглядным.

SQL-запрос в данном случае будет выглядеть следующим образом:

SELECT Countries.Name, Capitals.Name 
FROM Countries JOIN Capitals ON Countries.Id = Capitals.CountryID

В данной статье вы узнали как объединять таблицы в LINQ для извлечения из них данных.

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


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

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

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