Синтаксис внутреннего соединения в LINQ to SQL на C#

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

При выполнении внутреннего соединения в LINQ, вам следует использовать следующий код:

csharp
Скопировать код
var query = from c in context.Customers
            join o in context.Orders on c.ID equals o.CustomerID
            select new { c.Name, o.OrderDate };

Этот запрос сочетает данные из таблиц Customers и Orders, основываясь на совпадающих ID, и выбирает столбцы Name и OrderDate.

Формирование результатов с применением анонимных объектов

Для создания конкретных результатов запроса можно использовать анонимные объекты:

csharp
Скопировать код
from product in context.Products
join sale in context.Sales on product.ID equals sale.ProductID
select new { product.Name, sale.Date, sale.Quantity }; // Вы выбираете именно те данные, которые вам нужны!

Вместе с тем, запросы можно упростить, используя свойства навигации и исключая join:

csharp
Скопировать код
from sale in context.Sales
select new { sale.Product.Name, sale.Date, sale.Quantity }; // Отлично, не требуется использовать соединения!

Многоусловные соединения: двойной интерес!

Для соединения по нескольким условиям можно использовать логический оператор &&:

csharp
Скопировать код
from c in context.Customers
join o in context.Orders on c.ID equals o.CustomerID && c.Region equals o.ShipRegion
select new { c.Name, o.OrderDate }; // Находим клиентов и их заказы в одном регионе.

Улучшение читаемости соединения с помощью метода .Join()

Для повышения читаемости и возможности управления запросом следует использовать метод .Join():

csharp
Скопировать код
context.Customers
.Join(context.Orders,
      customer => customer.ID,
      order => order.CustomerID,
      (customer, order) => new { customer.Name, order.OrderDate }); // Вот как выразительно выглядит лямбда!

Визуализация

Представьте, что у вас есть две кухни с различными ингредиентами:

Markdown
Скопировать код
Кухня А (🍳): [Соль, Перец, Оливковое масло, Курица]
Кухня Б (🥘): [Перец, Томатный соус, Базилик, Оливковое масло]

Применив INNER JOIN, мы сможем объединить их общие ингредиенты:

Markdown
Скопировать код
🍳💠🥘: [Перец, Оливковое масло] // Идеальное сочетание вкуса.

Пример реализации приведен ниже:

csharp
Скопировать код
var jointDish = from a in Kitchens.A
                join b in Kitchens.B on a.Ingredient equals b.Ingredient
                select a;

🍽️ Готово к употреблению? Приятного аппетита!

Набор инструментов для оптимизации запросов

Точечные проекции

При создании select выражений отбирайте необходимые данные, чтобы оптимизировать объем передаваемой информации:

csharp
Скопировать код
select new { c.Name, c.Email, o.TotalAmount }; // Получаем только необходимые данные.

Пользуйтесь преимуществами отложенного выполнения

Преимущество отложенного выполнения в LINQ позволяет откладывать выполнение запроса до момента его актуализации, когда это действительно нужно:

csharp
Скопировать код
var query = from c in context.Customers
            join o in context.Orders on c.ID equals o.CustomerID
            select new { c, o };

// ... и позже
var filteredQuery = query.Where(c => c.o.TotalAmount > 100).ToList(); // Применён фильтр и выполнен запрос.

Ясность с помощью перечислений

Преобразовывайте численные значения в перечисления для более наглядного представления данных:

csharp
Скопировать код
select new { Status = (OrderStatus)o.Status, o.OrderDate }; // Сразу понятно, что обозначает статус.

Полезные материалы

  1. Выполнение внутренних соединений (LINQ в C#) – C# | Microsoft Learn
  2. Обзор образцов кода | Microsoft Learn
  3. c# – Проверка наличия имени колонки в объекте SqlDataReader – Stack Overflow
  4. Примеры внутреннего соединения LINQ в C# – Dot Net Tutorials
  5. Создание запросов к данным через DbSet
  6. LINQPad – Среда выполнения кода для .NET разработчиков