Синтаксис внутреннего соединения в LINQ to SQL на C#
Быстрый ответ
При выполнении внутреннего соединения в LINQ, вам следует использовать следующий код:
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
.
Формирование результатов с применением анонимных объектов
Для создания конкретных результатов запроса можно использовать анонимные объекты:
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
:
from sale in context.Sales
select new { sale.Product.Name, sale.Date, sale.Quantity }; // Отлично, не требуется использовать соединения!
Многоусловные соединения: двойной интерес!
Для соединения по нескольким условиям можно использовать логический оператор &&
:
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()
:
context.Customers
.Join(context.Orders,
customer => customer.ID,
order => order.CustomerID,
(customer, order) => new { customer.Name, order.OrderDate }); // Вот как выразительно выглядит лямбда!
Визуализация
Представьте, что у вас есть две кухни с различными ингредиентами:
Кухня А (🍳): [Соль, Перец, Оливковое масло, Курица]
Кухня Б (🥘): [Перец, Томатный соус, Базилик, Оливковое масло]
Применив INNER JOIN
, мы сможем объединить их общие ингредиенты:
🍳💠🥘: [Перец, Оливковое масло] // Идеальное сочетание вкуса.
Пример реализации приведен ниже:
var jointDish = from a in Kitchens.A
join b in Kitchens.B on a.Ingredient equals b.Ingredient
select a;
🍽️ Готово к употреблению? Приятного аппетита!
Набор инструментов для оптимизации запросов
Точечные проекции
При создании select
выражений отбирайте необходимые данные, чтобы оптимизировать объем передаваемой информации:
select new { c.Name, c.Email, o.TotalAmount }; // Получаем только необходимые данные.
Пользуйтесь преимуществами отложенного выполнения
Преимущество отложенного выполнения в LINQ позволяет откладывать выполнение запроса до момента его актуализации, когда это действительно нужно:
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(); // Применён фильтр и выполнен запрос.
Ясность с помощью перечислений
Преобразовывайте численные значения в перечисления для более наглядного представления данных:
select new { Status = (OrderStatus)o.Status, o.OrderDate }; // Сразу понятно, что обозначает статус.
Полезные материалы
- Выполнение внутренних соединений (LINQ в C#) – C# | Microsoft Learn
- Обзор образцов кода | Microsoft Learn
- c# – Проверка наличия имени колонки в объекте SqlDataReader – Stack Overflow
- Примеры внутреннего соединения LINQ в C# – Dot Net Tutorials
- Создание запросов к данным через DbSet
- LINQPad – Среда выполнения кода для .NET разработчиков