Соединение таблиц

Данное руководство устарело. Актуальное руководство: Руководство по Entity Framework Core

Последнее обновление: 31.10.2015

Для объединения таблиц по определенному критерию используется метод Join. Например, в нашем случае таблица телефонов и таблица компаний имеет общий критерий - id компании, по которому можно провести объединение таблиц:

using(PhoneContext db = new PhoneContext())
{
    var phones = db.Phones.Join(db.Companies, // второй набор
        p => p.CompanyId, // свойство-селектор объекта из первого набора
        c => c.Id, // свойство-селектор объекта из второго набора
        (p, c) => new // результат
        {
            Name=p.Name, 
            Company = c.Name, 
            Price=p.Price
        });
    foreach (var p in phones)
        Console.WriteLine("{0} ({1}) - {2}", p.Name, p.Company, p.Price);
}

Метод Join принимает четыре параметра:

  • вторую таблицу, которая соединяется с текущей

  • свойство объекта - столбец из первой таблицы, по которому идет соединение

  • свойство объекта - столбец из второй таблицы, по которому идет соединение

  • новый объект, который получается в результате соединения

В итоге данный запрос будет транслироваться в следующее выражение SQL:

SELECT [Extent1].[Price] AS [Price],     
	   [Extent1].[Name] AS [Name],     
	   [Extent2].[Name] AS [Name1]    
FROM  [dbo].[Phones] AS [Extent1]    
INNER JOIN [dbo].[Companies] AS [Extent2] 
ON [Extent1].[CompanyId] = [Extent2].[Id]

Аналогичного результата мы могли бы достигнуть, если бы использовали оператор join:

var phones = from p in db.Phones
    join c in db.Companies on p.CompanyId equals c.Id
    select new { Name=p.Name, Company = c.Name, Price=p.Price };

Соединение трех таблиц

Допустим, у нас есть три таблицы, которые связаны между собой и которые описываются следующими моделями:

public class Country
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public class Company
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int CountryId { get; set; }
    public Country Country { get; set; }
}
public class Phone
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Price { get; set; }

    public int CompanyId { get; set; }
    public Company Company { get; set; }
}

Объединим три таблицы в один набор:

var result = from phone in db.Phones
             join company in db.Companies on phone.CompanyId equals company.Id
             join country in db.Countries on company.CountryId equals country.Id
             select new 
			 { 
				Name = phone.Name, 
				Company = company.Name, 
				Price = phone.Price, 
				Country = country.Name 
			 };
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850