Sobes.tech
Назад к вопросам
Junior — Middle
55

Как выглядит объявление метода Where при использовании c IQueryable в C#?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Нужно показать, что Where для IQueryable<T> — это extension-метод из System.Linq, который принимает выражение-предикат в виде Expression<Func<T, bool>>. Такой формат важен, потому что запрос должен быть не выполнен сразу, а преобразован провайдером, например в SQL. Отличие от IEnumerable<T> — именно в использовании expression tree, а не обычного делегата.

Определение:

Для IQueryable<T> объявление Where выглядит как метод расширения, принимающий источник данных и выражение-условие:

public static IQueryable<TSource> Where<TSource>(
    this IQueryable<TSource> source,
    Expression<Func<TSource, bool>> predicate
)

Смысл в том, что predicate передаётся не как исполняемый код напрямую, а как дерево выражения, которое может анализировать LINQ-провайдер.

Пример использования:

using System.Linq;
using System.Linq.Expressions;

IQueryable<User> users = dbContext.Users;

var activeUsers = users.Where(u => u.IsActive);

Здесь users — это IQueryable<User>, и условие u => u.IsActive преобразуется в Expression<Func<User, bool>>.

Пояснение кода:

В этом примере Where не фильтрует коллекцию сразу в памяти. Вместо этого он добавляет условие в запрос, который позже может быть переведён, например, в SQL.

  1. dbContext.Users возвращает IQueryable<User>.
  2. Вызов Where(u => u.IsActive) создаёт выражение-предикат.
  3. Провайдер IQueryable сохраняет это условие как часть запроса.
  4. Выполнение произойдёт только при перечислении результата, например через ToList(), FirstOrDefault() или foreach.

Ключевые моменты:

  • Для IQueryable<T> используется Expression<Func<T, bool>>, а не Func<T, bool>.
  • Where для IQueryable работает через построение дерева выражений.
  • Запрос обычно выполняется отложенно, а не сразу.
  • Такой вариант нужен для трансляции запроса внешним провайдером, например в SQL.
  • При работе с IEnumerable<T> сигнатура похожа, но семантика другая: фильтрация выполняется в памяти.