2016-07-21 5 views
1

Bitte beachten Sie, unten ist zum Beispiel vollständig sake gemacht. Ich habe eine ähnliche Abfrage basierend auf einem SQL-Code, konnte aber nicht in LINQ übersetzen, um den richtigen Wert zu erhalten.wie Zugriff auf Tabelle von eingebettet, wo LINQ C#

Die SQL sieht grundsätzlich wie folgt:

select * from customers c 
join proucts p on c.id = p.customerid 
join credit r on r.customerid=c.id and ISNULL(r.trandate, c.registeredDate) >= c.registeredDate 

Ich habe auch versucht die oben SQL zu optimieren und den Zustand im Inneren, wo zu setzen und es gibt auch den gleichen Wert, den ich unten in meinem # 2 LINQ bin immer (die ist falsch).

Wie kann ich c (Kunden) innerhalb. Wo Kredit? siehe Code

1.

from c in customers 
join p in products on c.id = p.customerid 
join cr in credit.Where(r=> r.tranDate => c.registeredDate!=null?c.registeredDate : r.purchaseDate) on c.id=cr.customerid 
... 

2.

Ich weiß, Sie würde vorschlagen, warum es einfach nicht setzen in dem unten wie unten, aber ich bin immer falschen Wert.

from c in customers 
join p in products on c.id = p.customerid 
join cr in credit on c.id=cr.customerid 
where r.tranDate => c.registeredDate!=null?c.registeredDate : r.purchaseDate 

Gibt es einen Workaround? Ich habe viele andere ausprobiert, werde aber nicht den richtigen bekommen.

Antwort

1

LINQ unterstützt nur Equijoins. Alle zusätzlichen Kriterien sollten zu where Klausel gehen. Und ja, die anderen Bereichsvariablen sind von der inneren Sequenz join nicht zugänglich, so dass die Filterung vor oder nach der join stattfinden sollte.

Also diese SQL-Abfrage:

select * from customers c 
join products p on c.id = p.customerid 
join credit r on r.customerid = c.id 
    and ISNULL(r.trandate, c.registeredDate) >= c.registeredDate 

übersetzt direkt auf diese LINQ-Abfrage:

from c in customers 
join p in products on c.id equals p.customerid 
join cr in credit on c.id equals cr.customerid 
where (cr.tranDate ?? c.registeredDate) >= c.registeredDate 
select new { c, p, cr }; 

Optional der Bedingung

(cr.tranDate ?? c.registeredDate) >= c.registeredDate 

mit

ersetzt werden