Ich habe die folgende SQL, die ich in LINQ übersetzen möchte:
SELECT f.value
FROM period as p
LEFT OUTER JOIN facts AS f ON p.id = f.periodid AND f.otherid = 17
WHERE p.companyid = 100
Ich habe die typische Implementierung des linken äußeren Joins (dh into x from y in x.DefaultIfEmpty()
usw.) gesehen, bin mir aber nicht sicher, wie ich die andere Join-Bedingung einführen soll ( AND f.otherid = 17
)
BEARBEITEN
Warum ist die AND f.otherid = 17
Bedingung Teil von JOIN anstelle der WHERE-Klausel? Da f
für einige Zeilen möglicherweise nicht vorhanden ist und ich dennoch möchte, dass diese Zeilen enthalten sind. Wenn die Bedingung in der WHERE-Klausel nach dem JOIN angewendet wird, erhalte ich nicht das gewünschte Verhalten.
Leider das:
from p in context.Periods
join f in context.Facts on p.id equals f.periodid into fg
from fgi in fg.DefaultIfEmpty()
where p.companyid == 100 && fgi.otherid == 17
select f.value
scheint gleichbedeutend damit zu sein:
SELECT f.value
FROM period as p
LEFT OUTER JOIN facts AS f ON p.id = f.periodid
WHERE p.companyid = 100 AND f.otherid = 17
Das ist nicht ganz das, wonach ich suche.
c#
sql
linq
linq-to-sql
outer-join
Dan
quelle
quelle
Antworten:
Sie müssen Ihre Beitrittsbedingung einführen, bevor Sie anrufen
DefaultIfEmpty()
. Ich würde nur die Syntax der Erweiterungsmethode verwenden:Oder Sie könnten eine Unterabfrage verwenden:
quelle
Dies funktioniert auch, ... wenn Sie mehrere Spaltenverknüpfungen haben
quelle
Ich weiß, dass es " ein bisschen spät " ist, aber nur für den Fall, dass jemand dies in der LINQ-Methodensyntax tun muss ( weshalb ich diesen Beitrag ursprünglich gefunden habe ), wäre dies wie folgt :
quelle
.Select(fact.Value)
sollte sein.Select(f => f.Value)
Eine weitere gültige Option besteht darin, die Verknüpfungen wie folgt auf mehrere LINQ-Klauseln zu verteilen :
quelle
Kann mit einem zusammengesetzten Join-Schlüssel geschrieben werden. Auch wenn Eigenschaften sowohl von links als auch von rechts ausgewählt werden müssen, kann der LINQ als geschrieben werden
quelle
Es scheint mir sinnvoll zu sein, einige Änderungen an Ihrem SQL-Code in Betracht zu ziehen, bevor Sie versuchen, ihn zu übersetzen.
Persönlich würde ich eine solche Abfrage als Gewerkschaft schreiben (obwohl ich Nullen vollständig vermeiden würde!):
Ich stimme also dem Geist der Antwort von @ MAbraham1 zu (obwohl ihr Code nichts mit der Frage zu tun zu haben scheint).
Es scheint jedoch, dass die Abfrage ausdrücklich darauf ausgelegt ist, ein Ergebnis mit einer einzelnen Spalte zu erzeugen, das doppelte Zeilen enthält - tatsächlich doppelte Nullen! Es ist schwer, nicht zu dem Schluss zu kommen, dass dieser Ansatz fehlerhaft ist.
quelle