Встречается на 44% собеседований по C#

Знаешь LINQ

LINQ (Language Integrated Query) — это компонент платформы .NET, который добавляет в язык C# возможность написания декларативных запросов к различным источникам данных непосредственно в коде. Он предоставляет единый синтаксис и набор методов расширения для работы с коллекциями, базами данных, XML и другими форматами данных, реализующими интерфейс IEnumerable<T>.

Как это работает

LINQ основан на двух ключевых механизмах: синтаксисе запросов (query syntax) и синтаксисе методов (method syntax). Оба компилируются в вызовы методов расширения из пространства имен System.Linq. Основные операции включают фильтрацию (Where), проекцию (Select), сортировку (OrderBy), агрегацию (Sum, Count, Average) и группировку (GroupBy).

Пример синтаксиса запросов для LINQ to Objects:

csharp
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
var evenNumbers = from num in numbers
                  where num % 2 == 0
                  select num;

foreach (var num in evenNumbers)
{
    Console.WriteLine(num); // Выводит 2, 4, 6
}

Тот же запрос в синтаксисе методов:

csharp
var evenNumbers = numbers.Where(num => num % 2 == 0);

Применение в различных источниках данных

LINQ унифицирует доступ к данным, позволяя использовать один и тот же синтаксис для разных источников.

LINQ to Objects — работает с коллекциями в памяти, такими как массивы, списки и словари. Это наиболее частое применение.

LINQ to SQL / Entity Framework — транслирует LINQ-запросы в SQL-запросы к реляционным базам данных. Пример с Entity Framework:

csharp
using (var db = new AppDbContext())
{
    var londonCustomers = from customer in db.Customers
                          where customer.City == "London"
                          select customer;

    foreach (var customer in londonCustomers)
    {
        Console.WriteLine(customer.Name);
    }
}

LINQ to XML — предоставляет удобный способ работы с XML-документами. Пример:

csharp
XElement root = XElement.Load("customers.xml");
var customerNames = from customer in root.Elements("customer")
                    where (int)customer.Element("age") > 30
                    select customer.Element("name").Value;

foreach (var name in customerNames)
{
    Console.WriteLine(name);
}

Подводные камни и особенности

  • Отложенное выполнение: большинство LINQ-запросов выполняются лениво, то есть результат вычисляется только при перечислении. Это может привести к неожиданным результатам, если источник данных изменяется между созданием запроса и его выполнением.
  • Производительность: при работе с большими коллекциями некоторые операции (например, Count на IEnumerable<T>) могут быть дорогими. Используйте ToList() или ToArray() для материализации результатов, если запрос выполняется многократно.
  • Строгая типизация: LINQ обеспечивает проверку типов на этапе компиляции, что снижает количество ошибок, но требует понимания обобщенных типов и делегатов.
  • Различия в провайдерах: не все операции поддерживаются в LINQ to Entities или LINQ to SQL. Например, вызов пользовательских методов внутри запроса может привести к ошибке выполнения.

Когда использовать

LINQ применяется практически везде, где требуется обработка данных: фильтрация, сортировка, группировка, агрегация, преобразование коллекций. Он особенно полезен при работе с базами данных через ORM, так как позволяет писать типобезопасные запросы без ручного написания SQL. Однако для простых операций с очень большими объемами данных в памяти может быть эффективнее использовать циклы for или foreach из-за меньших накладных расходов.

Коротко

  • LINQ — единый синтаксис запросов для коллекций, БД, XML и других источников.
  • Два синтаксиса: query syntax и method syntax, оба компилируются в методы System.Linq.
  • Основные операции: Where, Select, OrderBy, GroupBy, агрегатные функции.
  • Помни об отложенном выполнении и различиях между провайдерами LINQ.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы