Ich versuche, explizit 3 Tabellen mit einem linken äußeren Join in einer Linq-Abfrage beitreten und läuft in Linq Parsing-Probleme. Das Ausführen einer inneren Verknüpfung wird korrekt analysiert und gibt Daten zurück, aber die Verwendung der linken äußeren Verbindung schlägt fehl.EntityFramework Linq Left Join Analysefehler - DotNet Core 1.0
Beispiel:
var query = from p in DatabaseContext.Products
where p.ClientID == clientID
join l in DatabaseContext.Licenses on p.ProductID equals l.ProductID into pl
from pli in pl.DefaultIfEmpty()
join a in DatabaseContext.Articles on p.ArticleID equals a.ArticleID into pa
from pai in pa.DefaultIfEmpty()
select new SomeEntityDTO
{
SomethingFromP = p.Something,
SomethingFromL = pli.Something,
SomethingFromA = pai.Something
};
Da beide verknüpften Tabellen Schlüssel der ersten Tabelle aus, I jeweils einzeln testen, indem die anderen verbinden, beispielsweise testen die Abfrage für P l und dann für P a . Diese Testabfragen funktionieren einwandfrei. Es ist auch möglich, die linke äußere Regel zu entfernen und ein korrektes Ergebnis zu erhalten.
var query = from p in DatabaseContext.Products
where p.ClientID == clientID
join l in DatabaseContext.Licenses on p.ProductID equals l.ProductID
join a in DatabaseContext.Articles on p.ArticleID equals a.ArticleID
select new SomeEntityDTO
... the rest ...
Anzeigen der säumige Abfrage in SQL Profiler (oben Codebeispiel) Ich sehe, dass die ersten beiden Tabellen erfolgreich verbunden sind, zB:
SELECT p.Something, l.Something
FROM Products AS p
LEFT JOIN Licenses AS l ON p.ProductID = l.ProductID
WHERE p.ClientID = 5
ORDER BY p.ProductID
Und ein anderer, dann rechts nach dieser erfolgreichen Abfrage, sind 2 Abfragen (identisch zueinander):
SELECT a.ArticleID, a.Something, <all fields, even when not specified in query>
FROM Articles AS a
ORDER BY a.ArticleID
die äußere verbundene 3-Tabellen erfolgreich ein Objekt zurückgeben, solange ich nicht versuchen, ein Feld aus dem „a“ Tabelle zuzugreifen. Wenn ich das tue, erhalte ich einen Null Exception Fehler, da diese Tabelle nie wirklich verbunden wurde.
Wie bereits erwähnt, wird durch das Entfernen der Outer-Join-Regel eine erfolgreich verknüpfte Abfrage zurückgegeben.
Ich habe versucht, die Linq-Abfrage einzustellen herauszufinden, dass der Linq-Parser ein Problem hatte, aber ohne Erfolg:
var query = from p in DatabaseContext.Products
from l in DatabaseContext.Licenses.Where(g => g.ProduktID == p.ProduktID).DefaultIfEmpty()
from a in DatabaseContext.Articles.Where(g => g.ArticleID == p.ArticleID).DefaultIfEmpty()
where ....
Diese parst auf einen Satz von CROSS applys, die überhaupt nicht funktionieren und den Eine profilierte Abfrage wird, wenn sie in ein Abfrageeditorfenster kopiert wird, überhaupt nicht ausgeführt (im Gegensatz zu den 3 einzelnen Abfragen, die im Profiler für das erste Codebeispiel angezeigt werden). Ich habe auch die komplizierteren Lambdas versucht, die auch nicht funktionieren.
Ist das ein Fehler im Linq-Parser? Mache ich das völlig falsch? (Nach den mehrfach beantworteten Fragen hier zu expliziten linken Outer Joins (im Gegensatz zu natürlichen Assoziationen), mache ich das richtig, aber es wird nicht korrekt analysiert. Ich habe es vermieden, die Assoziationen zu erstellen, so dass ich ihnen ohne assoziieren kann explizite Definition der Join.The ist möglicherweise erforderlich hier und wird nicht ordnungsgemäß ohne es?
Hinweis: Jede Tabelle verfügt über komplexe Schlüssel, aber ich muss nur wirklich auf Basis einzelner Schlüssel Werte (die DB ist Teil eines Produkts ich kann es nicht ändern).
Verwendung. DotNet Core EntityFramework, EntityFrameworkCore.SqlServer usw., alle Version 1.0.1.
Hilfe?
Es ist nicht deine Schuld. EF Core hat zu diesem Zeitpunkt immer noch Probleme mit linken Outer-Joins (und Abfragen im Allgemeinen). –
@Ian Stoev Danke für die Antwort. Kann ich eine andere Syntax verwenden, die nachweislich funktioniert? Zumindest bis der Weg, den ich versuche, in einer zukünftigen Version behoben wird? – Greg
AFAIK, leider nicht. Nur 'Include' funktioniert, Sie können SO nach ähnlichen Problemen suchen. Sie können auch versuchen 1.1 Beta, aber es sieht aus wie es auch instabil ist. –