Comprendre EF sous le capot. Inclure vs jointures

Je travaille avec Entity Framework depuis un certain temps, mais j’ai encore quelques “trous noirs” dans la façon dont cela fonctionne sous le capot. Même après avoir lu quelques articles, je ne suis pas sûr d’avoir bien compris.


Commençons par des questions:

  • Comment EF Include fonctionne sous le capot?
  • Quelles sont les différences entre Join et Include?
  • Des problèmes de performances avec Include (chargement paresseux ou chargement rapide, requêtes SQL générées, etc.)?
  • Quand devrais-je utiliser Joindre à la place de Inclure et vice versa?

Lorsque vous interrogez EF par le biais d’expressions linq ou lambda, vous n’avez besoin d’instructions de jointure que si le schéma sous-jacent ne fournit pas de FK et vous ne disposez donc pas de propriétés de navigation sur les objects.

De l’autre côté, include (chargement anticipé) et le chargement différé ne peuvent fonctionner que s’il existe des FK, car ils utilisent les propriétés de navigation.

Le SQL sous-jacent dans les deux cas utilisera des jointures (car SQL n’a pas de concept de “propriété de navigation”).

Quant à la performance, cela dépend des situations. Chargement paresseux vs chargement désagréable (dans le scénario FK) peut être un choix difficile.

J’utilise généralement le chargement paresseux, utile lorsque vous avez un résultat principal important, mais vous avez besoin des données de “jointure” de quelques éléments seulement de l’ensemble de résultats.

Si vous savez à l’avance que vous aurez besoin des données de jointure de l’ensemble des résultats, un chargement rapide pourrait être meilleur pour la performance. Je suggère d’expérimenter et de voir par vous-même.