2009-08-04 6 views
0

Wie kann ich die folgende SQL eine Linq-Abfrage machen:C# LINQ to SQL-OR-Statement in JOIN

SELECT * FROM ORDERS 
INNER JOIN ITEMS 
ON ORDERS.ID = ITEMS.ORDER_A OR ORDERS.ID = ITEMS.ORDER_B 

Ich denke, es wäre wäre:

from o in orders 
join i in items 
on o.ID equals i.OrderA or o.ID equals i.OrderB 
select new { Order = o, Item = i } 

Ich vermute Der Compiler möchte etwas anderes. Wie schreibe ich diese Aussage?

Antwort

2

Sie müssen zwei machen verbindet

from o in orders 
join iA in items on o.ID equals iA.OrderA 
join iB in items on o.ID equals iB.OrderB 
set i = (iA == null ? iB : iA) 
select new { Order = o, Item = i } 

eigentlich nicht versuchen, dies kompilieren, aber im Grunde ist das, was Sie zu tun haben, zwei verschiedene schließt sich, dass Sie wählen, bevor es in das Array ausgewählt geführt wird .

+0

warum nicht iA ?? iB –

+0

Das würde Datensätze nur für Aufträge zurückgeben, die in den Tabellen OrderA und OrderB einen entsprechenden Datensatz enthalten. Sie benötigen zwei linke Joins für diese Inline, wenn sie funktionieren sollen. –

+0

Ich denke, das funktioniert, meine letzte Abfrage ist ziemlich kompliziert, ich habe bereits 3 Joins und muss noch Outer dazukommen ... Ich wünschte, sie hätten Linq mehr wie SQL strukturiert. – jonathanpeppers

0

Was Sie verwenden möchten, ist http://msdn.microsoft.com/en-us/library/bb549267.aspx, leider glaube ich nicht, dass wird sehr gut in SQL übersetzen und kann nur als eine Erweiterungsmethode verwendet werden.

Obwohl Sie vielleicht einen Kreuz-Join verwenden und es in der Where-Bedingung filtern können? Ich würde das generierte SQL zuerst überprüfen, bevor ich diese Methode benutze.

from o in orders 
from i in items 
where o.ID == i.OrderA || o.ID == i.OrderB 
select new { Order = o, Item = i } 
+0

Ihr Code funktioniert nicht, das habe ich auch versucht. Sie müssen 2 Joins machen. – jonathanpeppers

+0

Ist es ein Problem mit SQL oder LINQ? Wie es lief, als ich es in LINQPad gegen eine Objektsammlung ausprobierte. –