Выбор ответа Junior EF Core спрашивают часто обновлено

Проблема N+1

Вопрос

Сколько SQL-запросов выполнит код при включённой ленивой загрузке, если в базе 100 блогов?

var blogs = db.Blogs.ToList();
foreach (var blog in blogs)
    Console.WriteLine($"{blog.Name}: {blog.Posts.Count}");

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: 101: один за блоги и по одному за посты каждого. Первый запрос загружает блоги.

Варианты ответа

  1. 1: EF Core объединит всё в один запрос с JOIN
  2. 2: блоги и все посты одним отдельным запросом
  3. 100: по запросу на блог, сами блоги берутся из кеша
  4. 101: один за блоги и по одному за посты каждогоправильный ответ

Разбор

Первый запрос загружает блоги. Затем обращение к blog.Posts у каждого блога лениво подгружает коллекцию отдельным запросом: ещё 100. Это классическая проблема N+1. EF Core сам не объединяет такие обращения. Лечится Include(b => b.Posts) или проекцией через Select с подсчётом в SQL.

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

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