← Назад к вопросам

Приведи пример LINQ

1.8 Middle🔥 41 комментариев
#Entity Framework и ORM

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