Ответ
В 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()). Это позволяет строить и комбинировать запросы эффективно.