Prenez soin de la performance:
J'ai constaté qu'au moins avec EF Core, les différentes réponses données ici pouvaient entraîner des performances différentes. Je suis conscient que l'OP a posé des questions sur Linq to SQL, mais il me semble que les mêmes questions se posent également avec EF Core.
Dans un cas spécifique que j'ai dû gérer, la suggestion (syntaxiquement plus agréable) de Marc Gravell a entraîné des jointures à gauche à l'intérieur d'une application croisée - de la même manière que Mike U a décrit - ce qui a eu pour résultat que les coûts estimés pour cette requête spécifique étaient de deux fois plus élevé par rapport à une requête sans jointures croisées . Les temps d'exécution du serveur différaient d'un facteur 3 . [1]
La solution de Marc Gravell a abouti à une requête sans jointures croisées.
Contexte: J'avais essentiellement besoin d'effectuer deux jointures à gauche sur deux tables dont chacune nécessitait à nouveau une jointure à une autre table. De plus, là, j'ai dû spécifier d'autres conditions where sur les tables sur lesquelles je devais appliquer la jointure gauche. De plus, j'avais deux jointures internes sur la table principale.
Estimation des coûts d'opérateur:
- avec croix s'appliquent: 0,2534
- sans croix s'appliquent: 0,0991.
Temps d'exécution du serveur en ms (requêtes exécutées 10 fois; mesurées à l'aide de SET STATISTICS TIME ON):
- avec croix appliquer: 5, 6, 6, 6, 6, 6, 6, 6, 6, 6
- sans croix s'appliquent: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
(La toute première exécution était plus lente pour les deux requêtes; il semble que quelque chose soit mis en cache.)
Tailles de table:
- table principale: 87 lignes,
- première table pour jointure gauche: 179 lignes;
- deuxième table pour jointure gauche: 7 lignes.
Version EF Core: 2.2.1.
Version de SQL Server: MS SQL Server 2017 - 14 ... (sous Windows 10).
Toutes les tables pertinentes avaient des index sur les clés primaires uniquement.
Ma conclusion: il est toujours recommandé de regarder le SQL généré car il peut vraiment différer.
[1] Il est intéressant de noter que lors de la configuration des «Statistiques client» dans MS SQL Server Management Studio, j'ai pu voir une tendance opposée; à savoir que la dernière exécution de la solution sans application croisée a pris plus de 1 s. Je suppose que quelque chose n'allait pas ici - peut-être avec ma configuration.