Что выведет код Middle EF Core обновлено

Отложенный запрос и повторное перечисление

Вопрос

Что выведет программа (.NET 8)? По строке на каждый вывод.

var source = new List<int> { 1, 2, 3 };
int queries = 0;
IEnumerable<int> Load()
{
    queries++;
    foreach (var x in source) yield return x;
}

var q = Load().Where(x => x > 1);
if (q.Any())
    Console.WriteLine(q.Count());
Console.WriteLine(queries);
var list = q.ToList();
Console.WriteLine(list.Count + list.Count);
Console.WriteLine(queries);

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: 2, 2, 4, 3. Метод-итератор моделирует запрос к базе: его тело выполняется при каждом перечислении.

Что выведет

2
2
4
3

Разбор

Метод-итератор моделирует запрос к базе: его тело выполняется при каждом перечислении. Any() и Count() перечисляют q по отдельности: печатается Count, равный 2, и счётчик «запросов» тоже 2. ToList() перечисляет третий раз, а list.Count + list.Count берёт размер готовой коллекции без перечисления: 4, счётчик 3. С IQueryable в EF Core было бы то же самое, только каждый раз с реальным SQL.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.