Achten Sie auf die Leistung:
Ich habe festgestellt, dass zumindest bei EF Core die hier gegebenen unterschiedlichen Antworten zu einer unterschiedlichen Leistung führen können. Ich bin mir bewusst, dass das OP nach Linq to SQL gefragt hat, aber es scheint mir, dass die gleichen Fragen auch bei EF Core auftreten.
In einem bestimmten Fall, den ich behandeln musste, führte der (syntaktisch schönere) Vorschlag von Marc Gravell dazu, dass Linksverknüpfungen innerhalb eines Kreuzes angewendet wurden - ähnlich wie von Mike U beschrieben -, was dazu führte, dass die geschätzten Kosten für diese spezielle Abfrage zwei waren mal so hoch im Vergleich zu einer Abfrage ohne Cross-Joins . Die Serverausführungszeiten unterschieden sich um den Faktor 3 . [1]
Die Lösung von Marc Gravell führte zu einer Abfrage ohne Cross-Joins.
Kontext: Ich musste im Wesentlichen zwei Linksverknüpfungen für zwei Tabellen ausführen, von denen jede wiederum eine Verknüpfung mit einer anderen Tabelle erforderte. Außerdem musste ich dort andere Where-Bedingungen in den Tabellen angeben, auf die ich den linken Join anwenden musste. Außerdem hatte ich zwei innere Verknüpfungen auf dem Haupttisch.
Geschätzte Betreiberkosten:
- mit Kreuz anwenden: 0,2534
- ohne Kreuz zutreffen: 0,0991.
Serverausführungszeiten in ms (Abfragen werden 10 Mal ausgeführt; gemessen mit SET STATISTICS TIME ON):
- mit Kreuz anwenden: 5, 6, 6, 6, 6, 6, 6, 6, 6, 6
- ohne Kreuz anwenden: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
(Der allererste Lauf war für beide Abfragen langsamer; anscheinend wird etwas zwischengespeichert.)
Tischgrößen:
- Haupttabelle: 87 Zeilen,
- erste Tabelle für Linksverknüpfung: 179 Zeilen;
- zweite Tabelle für Linksverknüpfung: 7 Zeilen.
EF Core-Version: 2.2.1.
SQL Server-Version: MS SQL Server 2017 - 14 ... (unter Windows 10).
Alle relevanten Tabellen hatten nur Indizes für die Primärschlüssel.
Mein Fazit: Es wird immer empfohlen, sich das generierte SQL anzusehen, da es sich wirklich unterscheiden kann.
[1] Interessanterweise konnte ich beim Aktivieren der Clientstatistik in MS SQL Server Management Studio einen entgegengesetzten Trend feststellen. Der letzte Durchlauf der Lösung ohne Kreuzanwendung dauerte nämlich mehr als 1 s. Ich nehme an, dass hier etwas schief gelaufen ist - vielleicht mit meinem Setup.