LINQ & EF Core : performance

Le même résultat peut coûter 1 requête… ou 1000. Comparez le code naïf et le code optimisé, et voyez l'impact sur le disque, le CPU et la mémoire.

En LINQ, s'exécute votre requête change tout : côté base de données (IQueryable) ou en mémoire après ToList() (IEnumerable). Chaque scénario montre le code « avant », le code « après », le SQL généré et le coût estimé sur trois axes.

Les niveaux de coût sont des ordres de grandeur illustratifs (pas des mesures) : ils servent à comparer le « avant » et le « après », pas à donner un chiffre absolu.

Le piège N+1, en un schéma

L'erreur de performance la plus courante avec EF Core : une boucle qui déclenche une requête à chaque tour. À gauche le piège, à droite la parade.

❌ N+1 requêtes
foreach (var c in clients) { // accès paresseux à c.Commandes afficher(c.Commandes); // +1 requête } APPLICATION BASE DE DONNÉES App la boucle BDD SQL Server requête 1 · liste des clients +1 +1 +1 … une par client (× N) 1 + N requêtes chaque tour de boucle = 1 aller-retour réseau 1000 clients ➜ 1001 requêtes 😱
✅ Une seule requête
context.Clients .Include(c => c.Commandes) .ToList(); // tout d'un coup // (ou une projection / un Join) APPLICATION BASE DE DONNÉES App une requête BDD jointure unique 1 requête (clients + commandes) ↩ 1 réponse 1 requête on charge tout d'un coup 1000 clients ➜ 1 requête 🚀

Le piège N+1 : une requête pour la liste, puis une par élément pour ses détails → des centaines d'allers-retours. La parade : charger les données liées en une seule requête (Include / projection / Join). Mesure toujours le SQL généré.

Retour aux outils