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




