Entspricht diese Abfrage einem LEFT OUTER
Join?
//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
quelle
quelle
Sie brauchen die into-Anweisungen nicht:
Und ja, die obige Abfrage erzeugt tatsächlich einen LEFT OUTER-Join.
Link zu einer ähnlichen Frage, die mehrere linke Verknüpfungen behandelt: Linq to Sql: Mehrere linke äußere Verknüpfungen
quelle
Überprüfen Sie http://msdn.microsoft.com/en-us/vbasic/bb737929.aspx
quelle
Ich habe 1 Lösung gefunden. Wenn Sie diese Art von SQL (linker Join) in Linq Entity übersetzen möchten ...
SQL:
LINQ:
quelle
DefaultIfEmpty
.Ich möchte noch etwas hinzufügen. Wenn in LINQ to SQL Ihre Datenbank ordnungsgemäß erstellt wurde und Ihre Tabellen durch Fremdschlüsseleinschränkungen verknüpft sind, müssen Sie überhaupt keinen Join ausführen.
Mit LINQPad habe ich die folgende LINQ-Abfrage erstellt:
Welches wurde in die (leicht abgeschnittene) Abfrage unten übersetzt
Beachten Sie die
LEFT OUTER JOIN
oben genannten.quelle
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:
Serverausführungszeiten in ms (Abfragen werden 10 Mal ausgeführt; gemessen mit SET STATISTICS TIME ON):
(Der allererste Lauf war für beide Abfragen langsamer; anscheinend wird etwas zwischengespeichert.)
Tischgrößen:
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.
quelle