Выбор ответа 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: EF Core объединит всё в один запрос с JOIN
- 2: блоги и все посты одним отдельным запросом
- 100: по запросу на блог, сами блоги берутся из кеша
- 101: один за блоги и по одному за посты каждогоправильный ответ
Разбор
Первый запрос загружает блоги. Затем обращение к blog.Posts у каждого блога лениво подгружает коллекцию отдельным запросом: ещё 100. Это классическая проблема N+1. EF Core сам не объединяет такие обращения. Лечится Include(b => b.Posts) или проекцией через Select с подсчётом в SQL.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.