Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
LINQ (Language Integrated Query)
LINQ — это мощный инструмент для работы с данными в .NET, позволяющий писать запросы прямо на C# к коллекциям, базам данных, XML и другим источникам данных. Существует два синтаксиса: Query Syntax и Method Syntax.
Пример 1: Базовая работа с коллекциями
var products = new List<Product>
{
new Product { Id = 1, Name = "Laptop", Price = 1000, Category = "Electronics" },
new Product { Id = 2, Name = "Mouse", Price = 25, Category = "Electronics" },
new Product { Id = 3, Name = "Desk", Price = 300, Category = "Furniture" },
new Product { Id = 4, Name = "Chair", Price = 150, Category = "Furniture" }
};
// Query Syntax
var expensive = from p in products
where p.Price > 100
orderby p.Price descending
select p;
// Method Syntax (эквивалентно)
var expensive = products
.Where(p => p.Price > 100)
.OrderByDescending(p => p.Price);
foreach (var product in expensive)
{
Console.WriteLine($"{product.Name}: {product.Price}");
}
// Output:
// Laptop: 1000
// Desk: 300
Пример 2: Группировка и агрегация
// Группируем продукты по категориям
var grouped = from p in products
group p by p.Category into g
select new { Category = g.Key, Count = g.Count(), AvgPrice = g.Average(p => p.Price) };
// Method Syntax
var grouped = products
.GroupBy(p => p.Category)
.Select(g => new
{
Category = g.Key,
Count = g.Count(),
AvgPrice = g.Average(p => p.Price)
});
foreach (var group in grouped)
{
Console.WriteLine($"{group.Category}: {group.Count} товаров, средняя цена: {group.AvgPrice}");
}
// Output:
// Electronics: 2 товаров, средняя цена: 512.5
// Furniture: 2 товаров, средняя цена: 225
Пример 3: Joins (объединение коллекций)
var orders = new List<Order>
{
new Order { Id = 1, ProductId = 1, Quantity = 2 },
new Order { Id = 2, ProductId = 3, Quantity = 1 },
new Order { Id = 3, ProductId = 1, Quantity = 3 }
};
// Inner Join
var result = from o in orders
join p in products on o.ProductId equals p.Id
select new { OrderId = o.Id, ProductName = p.Name, Quantity = o.Quantity };
// Method Syntax
var result = orders
.Join(products, o => o.ProductId, p => p.Id,
(o, p) => new { OrderId = o.Id, ProductName = p.Name, Quantity = o.Quantity });
foreach (var item in result)
{
Console.WriteLine($"Order {item.OrderId}: {item.Quantity}x {item.ProductName}");
}
Пример 4: Lazy Evaluation (ленивые вычисления)
var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// Это НЕ выполняется сразу!
var query = numbers
.Where(n => { Console.WriteLine($"Checking {n}"); return n > 5; })
.Select(n => { Console.WriteLine($"Processing {n}"); return n * 2; });
Console.WriteLine("Query created (nothing printed yet)");
// Выполнение происходит ТУТ (при итерации)
foreach (var item in query)
{
Console.WriteLine($"Result: {item}");
}
Пример 5: LINQ to Objects vs LINQ to SQL
// LINQ to Objects (память)
var localUsers = new List<User> { /* ... */ };
var activeLocals = localUsers.Where(u => u.IsActive).ToList();
// LINQ to Entities (база данных)
using (var context = new AppDbContext())
{
// Это преобразуется в SQL запрос!
var activeDbUsers = context.Users
.Where(u => u.IsActive)
.ToList(); // ToList() выполняет запрос
}
Практические операторы
- Where — фильтрация
- Select — трансформация
- SelectMany — раскрытие вложенных коллекций
- OrderBy/OrderByDescending — сортировка
- GroupBy — группировка
- Join/GroupJoin — объединение
- Distinct — уникальные значения
- Take/Skip — постраничная выборка
- FirstOrDefault/SingleOrDefault — получение элемента
- Aggregate — кастомная агрегация
LINQ позволяет писать декларативный, читаемый код для работы с данными, скрывая сложность итерации и трансформации.