2017-02-01 3 views
0

ich verbunden bin mit dem Adventure Works 2012-Datenbank LINQPad wie unten gezeigt:Linq Full Outer Join Fehler

enter image description here

Ich versuche, sich einer vollständigen Außen zu schreiben. Meine Forschung sagt mir, es sollte wie folgt aussehen (wie im Screenshot zu sehen):

var LeftOuterJoin = from p in Products 
join pv in ProductVendors on p.ProductID equals pv.ProductID into ppv 
from pv in ppv.DefaultIfEmpty() 
select new {ProductName = p.Name}; 

var RightOuterJoin = from v in Vendors 
join pv in ProductVendors on v.BusinessEntityID equals pv.BusinessEntityID into ppv 
from pv in ppv.DefaultIfEmpty() 
select new {VendorName = v.Name}; 

LeftOuterJoin.Union(RightOuterJoin); 

jedoch der Fehler im Screenshot (siehe Screenshot) ist:

'System.Linq.IQueryable<AnonymousType#1>' does not contain a definition for 'Union' and the best extension method overload 'System.Linq.ParallelEnumerable.Union<TSource>(System.Linq.ParallelQuery<TSource>, System.Collections.Generic.IEnumerable<TSource>)' has some invalid arguments 

Instance argument: cannot convert from 'System.Linq.IQueryable<AnonymousType#1>' to 'System.Linq.ParallelQuery<AnonymousType#2>' 

Was ist das Problem?

+0

(LeftOuterJoin.toList()). Union (RightOuterJoin.toList()); – Viplock

+0

@Viblock, der Fehler, den ich damit bekomme, ist: 'System.Linq.IQueryable ' enthält keine Definition für 'toList' und keine Erweiterungsmethode 'toList' akzeptiert ein erstes Argument vom Typ 'System.Linq .IQueryable konnte gefunden werden (drücken Sie F4, um eine using-Anweisung oder Assemblyreferenz hinzuzufügen) 'System.Linq.IQueryable ' enthält keine Definition für 'toList' und keine Erweiterungsmethode 'toList' akzeptiert ein erstes Argument vom Typ 'System.Linq.IQueryable ' könnte gefunden werden (fehlt Ihnen eine Using-Direktive oder eine Assembly-Referenz?) – w0051977

+1

wie ich sehe, gibt es Typ Problem, beide anonym type haben unterschiedliche Eigenschaften, so dass das Problem bei der Verwendung von "Union" auftreten kann. Sie können einen gemeinsamen Typ mit derselben Eigenschaft erstellen und verwenden. oder haben beide Eigenschaft und verwenden Sie nach Abfrage. – Viplock

Antwort

2

Wie ich sehen kann, gibt es Typ Problem, beide anonymen Typ haben unterschiedliche Eigenschaften, so dass das Problem für die Verwendung von Union verursacht wird. Sie können einen gemeinsamen Typ mit derselben Eigenschaft erstellen und verwenden. oder haben beide Eigentum und Nutzung nach wie abfragen:

var LeftOuterJoin = from p in Products 
join pv in ProductVendors on p.ProductID equals pv.ProductID into ppv 
from pv in ppv.DefaultIfEmpty() 
select new {VendorName = "", 
      ProductName = p.Name,}; 

var RightOuterJoin = from v in Vendors 
join pv in ProductVendors on v.BusinessEntityID equals pv.BusinessEntityID into ppv 
from pv in ppv.DefaultIfEmpty() 
select new {VendorName = v.Name, 
      ProductName = "",}; 

var result = LeftOuterJoin.Union(RightOuterJoin).ToList(); // force execution to get results. 

verwenden diese, wenn Sie mit LinqPad

var result = LeftOuterJoin.Union(RightOuterJoin) 
result .Dump(); 

Dies wird für Sie arbeiten.

+0

Danke. Die Abfrage wird ausgeführt, gibt jedoch keine Ergebnisse zurück. Die entsprechende SQL-Abfrage gibt Hunderte von Ergebnissen zurück. – w0051977

+0

führt Ihre separaten Linq-Abfragen die Daten ordnungsgemäß zurück, überprüfen Sie zuerst, ob die Linq-Abfragen korrekt sind ?, und überprüfen Sie die SQL-Abfrage erstellt von SQL Profiler – Viplock

+0

ja. Die zwei Abfragen werden wie erwartet unabhängig ausgeführt. Ich denke, dass es die Variablendeklarationen ist, die das Problem verursachen. Sollte dies eine C# -Anweisung in Linqpad sein? – w0051977