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 для извлечения из них данных.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.