Встречается на собеседованиях • сегодня

Что такое LINQ

Это инструмент для работы с коллекциями, представляет собой список методов расширения, которые служат для выполнения различных действия, таких как например выборка по определенным параметрам, сортировка и прочее. Использовать LINQ можно только к тем объектам, которые содержат в себе реализацию интерфейса IEnumirable(коллекции). По Своей сути сход с SQL запросами такими как select, where, groupBy и.т.д. Есть два разных подхода - это LINQ to Objects(использует IEnumerator) и LINQ to entities(использует IQueryable), в первом случае мы работаем с обычными коллекциями в памяти, лямбда выражения(x => x.id == 1), которые лежат в основе LINQ, при таком подходе преобразуются в делегаты, выполнение операций является отложенным, то есть пока не начинается переборка или вызов ToList() или Count(), код не начинает перебежку по коллекции, такие операторы как, например, where и select отдают данные по мере чтения, а OrderBy, GroupBy и ToList() буферизуют(то есть запоминают весь набор, при этом на него нужна память) и после этого отдают объект. При подходе же LINQ to Entities мы работаем с удаленными источниками(например БД в EF), в таком случае наши лямбда выражения превращаются уже не в делегаты, а в деревья выражений и работают по индексам в БД, где сам источник(база данных к которой идет запрос) превращает это в свой код(обычно SQL) и выполняет все необходимые действия уже на своей стороне, а нам отдает готовые данные. Пример:
У нас есть таблица пользователей в базе данных c полями id, name, age и мы хотим вытянуть оттуда всех пользователей у которых имя «Ivan», тогда мы пишем вот такой запрос:

text
var Ivans = db.Users
.where(user => user.name == «Ivan»)
.ToList();

На данном этапе мы на стороне базы данных отсортировали данные, получили их и преобразовали в лист, который теперь есть у нас в памяти, то есть теперь, мы будем работать с ним по подходу LINQ to Object, предположим, что теперь мы хотим выбрать всех Иванов, у которых возраст будет больше или равен 21, тогда мы уже из нашего листа можем вызвать LINQ метод и получится

text
Ivans21 = Ivans.where(ivan => ivan.Age >= 21);

Стоит так же упомянуть, что LINQ методы могут идти друг за другом и выполнять разные операции, например:

text
var result = users.Where(u => u.Age >= 18).OrderBy(u => u.LastName).Select(u => u.LastName);

по итогу выполнения этой операции у нас в коллекции будут лежать фамилии пользователей, чей возраст больше 18 и отсортировано все будет по фамилии.

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы