Код IT
← Каталог

ORM на практике — Оптимизация производительности и N+1 проблема

Фрагмент из «ORM на практике»: Оптимизация производительности и N+1 проблема.

C# main.cs
// Пример проблемы N+1
var authors = context.Authors.ToList(); // 1 запрос

foreach (var author in authors)
{
    var books = author.Books.ToList(); // N дополнительных запросов
    foreach (var book in books)
    {
        Console.WriteLine(book.Title);
    }
}

// Решение с предварительной загрузкой
var authors = context.Authors
    .Include(a => a.Books)
    .ThenInclude(b => b.Genres)
    .ToList(); // 1 запрос с JOIN

foreach (var author in authors)
{
    foreach (var book in author.Books)
    {
        Console.WriteLine(book.Title);
    }
}
// Пример проблемы N+1
var authors = context.Authors.ToList(); // 1 запрос

foreach (var author in authors)
{
    var books = author.Books.ToList(); // N дополнительных запросов
    foreach (var book in books)
    {
        Console.WriteLine(book.Title);
    }
}

// Решение с предварительной загрузкой
var authors = context.Authors
    .Include(a => a.Books)
    .ThenInclude(b => b.Genres)
    .ToList(); // 1 запрос с JOIN

foreach (var author in authors)
{
    foreach (var book in author.Books)
    {
        Console.WriteLine(book.Title);
    }
}