Знаешь LINQ

LINQ (Language Integrated Query) — это технология в .NET, которая позволяет писать запросы к коллекциям (например, массивам, спискам, базам данных, XML, JSON и т.п.) не выходя из C# или VB.NET, используя единый стиль.

LINQ объединяет возможности SQL-подобного синтаксиса с проверкой типов на этапе компиляции и полной интеграцией с языком программирования. Это делает работу с данными более декларативной и безопасной.

🔹 Основные концепции LINQ

1. Унифицированный подход к работе с данными

До LINQ для разных источников данных нужно было писать разный код: ADO.NET для БД, XPath для XML, циклы foreach для коллекций и т.д. LINQ унифицировал доступ:

var numbers = new List<int> {1, 2, 3, 4, 5};
var even = numbers.Where(n => n % 2 == 0);

2. Функциональный стиль

LINQ активно использует делегаты и лямбды, что делает код компактным и выразительным.

🔹 Типы LINQ

1. LINQ to Objects

Работа с коллекциями в памяти (List, Array, HashSet и др.).

var result = list.Where(x => x > 10).OrderBy(x => x);

2. LINQ to SQL / LINQ to Entities (Entity Framework)

Генерирует SQL-запросы к базе данных:

var users = dbContext.Users.Where(u => u.Age > 18).ToList();

3. LINQ to XML

Запросы к XML-документам:

var names = from el in xml.Elements("user")
where (int)el.Element("age") > 18
select el.Element("name").Value;

4. LINQ to DataSet

Запросы к DataSet, полученному из БД.

5. LINQ to JSON (через библиотеки вроде Newtonsoft.Json)

Запросы к JSON-документам, преобразованным в объекты.

🔹 Синтаксис LINQ

1. Метод-ориентированный (лямбда)

var res = numbers.Where(n => n % 2 == 0).Select(n => n \* n);

2. Запросный (SQL-подобный)

var res = from n in numbers
where n % 2 == 0
select n \* n;

Оба варианта дают одинаковый результат.

🔹 Важные методы LINQ

Метод Назначение
Where Фильтрация элементов
--- ---
Select Проекция (выборка нужных данных)
--- ---
OrderBy / ThenBy Сортировка
--- ---
GroupBy Группировка
--- ---
Join Объединение двух коллекций по ключу
--- ---
Aggregate Агрегация (например, суммирование)
--- ---
Distinct Удаление дубликатов
--- ---
Take / Skip Пропуск или выбор N элементов
--- ---
Any / All Проверка условий
--- ---
First / FirstOrDefault Первый элемент
--- ---
Sum, Min, Max, Average Агрегатные функции
--- ---
ToList, ToArray, ToDictionary Преобразования
--- ---

🔹 Примеры

Фильтрация

var adults = people.Where(p => p.Age >= 18);

Сортировка

var sorted = people.OrderBy(p => p.LastName).ThenBy(p => p.FirstName);

Группировка

var byCity = people.GroupBy(p => p.City);

Объединение (join)

var result = from s in students
join g in grades on s.Id equals g.StudentId
select new { s.Name, g.Score };

Проверка

bool hasMinor = people.Any(p => p.Age < 18);

🔹 Преимущества LINQ

  • Понятность: читаемый декларативный стиль.

  • Безопасность типов: ошибки ловятся во время компиляции.

  • Гибкость: можно легко перейти от List<T> к IQueryable<T> (например, для БД).

  • Композиционность: можно строить цепочки операций.

  • Повторное использование: можно передавать выражения (Expression<Func) и переиспользовать логику.

🔹 LINQ и отложенное выполнение (Deferred Execution)

Многие методы LINQ (например, Where, Select) не исполняются сразу — только при итерации (foreach, ToList() и т.п.):

var query = list.Where(x => x > 5); // тут ничего не исполняется

var result = query.ToList(); // вот тут начинается выполнение

Это позволяет писать производительный и ленивый код, но нужно быть внимательным при модификации коллекций между определением и использованием запроса.