Знаешь 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(); // вот тут начинается выполнение
Это позволяет писать производительный и ленивый код, но нужно быть внимательным при модификации коллекций между определением и использованием запроса.