Cette requête est-elle équivalente à une LEFT OUTER
jointure?
//assuming that I have a parameter named 'invoiceId' of type int
from c in SupportCases
let invoice = c.Invoices.FirstOrDefault(i=> i.Id == invoiceId)
where (invoiceId == 0 || invoice != null)
select new
{
Id = c.Id
, InvoiceId = invoice == null ? 0 : invoice.Id
}
.net
database
linq
linq-to-sql
Ali Kazmi
la source
la source
Vous n'avez pas besoin des instructions into:
Et oui, la requête ci-dessus crée en effet une jointure LEFT OUTER.
Lien vers une question similaire qui gère plusieurs jointures à gauche: Linq à Sql: plusieurs jointures externes à gauche
la source
Vérifiez http://msdn.microsoft.com/en-us/vbasic/bb737929.aspx
la source
J'ai trouvé 1 solution. si vous voulez traduire ce type de SQL (jointure gauche) en entité Linq ...
SQL:
LINQ:
la source
DefaultIfEmpty
.J'aimerais ajouter une dernière chose. Dans LINQ to SQL, si votre base de données est correctement construite et que vos tables sont liées via des contraintes de clé étrangère, vous n'avez pas du tout besoin de faire une jointure.
À l'aide de LINQPad, j'ai créé la requête LINQ suivante:
Ce qui a été traduit en requête (légèrement tronquée) ci-dessous
Notez ce qui
LEFT OUTER JOIN
précède.la source
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:
Temps d'exécution du serveur en ms (requêtes exécutées 10 fois; mesurées à l'aide de SET STATISTICS TIME ON):
(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:
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.
la source