Какие есть типы запросов в LINQ?

«Какие есть типы запросов в LINQ?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В LINQ (Language Integrated Query) можно выделить типы по синтаксису написания и по источнику данных.

1. Типы по синтаксису

a) Синтаксис запросов (Query Syntax)

Напоминает SQL, использует ключевые слова from, where, select, group by, orderby и т.д.

// Пример: выборка и сортировка
var query = from product in products
            where product.Price > 100 && product.Category == "Electronics"
            orderby product.Price descending
            select new { product.Name, product.Price };

Плюсы: Читаемость для сложных операций соединения (join) и группировки. Минусы: Поддерживает не все операторы LINQ.

b) Синтаксис методов (Method Syntax / Fluent Syntax)

Использует цепочки методов расширения (Where, Select, OrderBy), основанные на лямбда-выражениях.

// Тот же запрос в синтаксисе методов
var query = products
    .Where(p => p.Price > 100 && p.Category == "Electronics")
    .OrderByDescending(p => p.Price)
    .Select(p => new { p.Name, p.Price });

Плюсы: Более гибкий, поддерживает все операторы LINQ, компактный для простых запросов. Минусы: Цепочки могут стать длинными и менее читаемыми.

Важно: Оба синтаксиса компилируются в одинаковый IL-код. Их можно комбинировать в одном запросе.

2. Типы по источнику данных (технологии LINQ)

a) LINQ to Objects

Работает с любыми коллекциями в памяти, реализующими IEnumerable<T>.

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

b) LINQ to Entities (ранее LINQ to SQL)

Используется с Entity Framework Core. Запросы транслируются в SQL и выполняются на стороне базы данных.

// DbContext - часть Entity Framework Core
using var db = new AppDbContext();
var users = await db.Users
                    .Where(u => u.IsActive)
                    .OrderBy(u => u.LastName)
                    .ToListAsync(); // Генерирует и выполняет SQL

c) LINQ to XML

Предоставляет удобный API для работы с XML-документами.

XDocument doc = XDocument.Load("data.xml");
var titles = from element in doc.Descendants("book")
             where (int)element.Element("price") > 20
             select element.Element("title").Value;

d) Parallel LINQ (PLINQ)

Расширение LINQ to Objects для параллельного выполнения запросов на многоядерных процессорах.

var source = Enumerable.Range(1, 1000000);
var parallelQuery = source.AsParallel()
                         .Where(n => n % 2 == 0)
                         .ToArray(); // Выполняется параллельно

Ключевой принцип: Независимо от типа, LINQ использует отложенное выполнение (deferred execution). Запрос не выполняется до момента реальной итерации по результатам (например, в foreach, ToList(), Count()). Это позволяет строить и комбинировать запросы эффективно.