Что выведет код 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 ошибок.