Ich arbeite an der Konvertierung einer Oracle SQL-Abfrage nach Linq und nicht sicher, wie es weiter geht. Hier ist die SQL-Abfrage:Linq-Abfrage mit mehreren Unterabfragen
SELECT *
FROM CustomerShip,
(SELECT DISTINCT b.ShipSeq AS shipSeq
FROM Orders a,
CustomerShip b
WHERE a.OrderId IN (SELECT OrderId
FROM Orders
WHERE CustomerId = @CustomerId
AND OrderType <> 'A')
AND b.CustomerId = @CustomerId
AND b.ShipSeq = a.CustShip
AND OrderStatus <> 'C'
GROUP BY b.ShipSeq) i
WHERE CustomerId = @CustomerId
AND (Address NOT LIKE '%RETAIL%STORE%')
AND ShipSeq = i.ShipSeq(+)
ORDER BY ShipTo DESC, OrderDate DESC;
ich versucht haben, brechen sie in drei separate Abfragen, wenn zu Linq zu konvertieren.
var query1 = from c in CustomerShip
where c.CustomerId == customerId
&& !c.Address.Contains("RETAIL")
&& !c.Address.Contains("STORE")
orderby c.ShipTo descending, c.OrderDate descending
select c;
var query2 = from o in Orders
where o.CustomerId == customerId
&& !o.OrderType.Equals("A")
select o.OrderId;
var query3 = (from o in Orders
from c in CustomerShip
where c.CustomerId == customerId
&& c.ShipSeq == o.CustShip
&& !o.OrderStatus.Equals("A")
select c.ShipSeq).Distinct();
Jetzt versuche ich, sie alle in einer Abfrage zusammenzustellen, aber nicht sicher, wie es geht. Hier ist die Richtung, ich gehe:
var query = from c in CustomerShip
let subquery = from o in Orders
where o.CustomerId == customerId
&& !o.OrderType.Equals("A")
select o.OrderId
from or in model.Orders
where subquery.Contains(or.OrderId)
&& c.CustomerId == customerId
&& c.ShipSeq == or.CustShip
&& !or.OrderStatus.Equals("A")
group c by c.ShipSeq
into i
select c.ShipSeq
where c.CustomerId == customerId
&& !c.Address.Contains("RETAIL")
&& !c.Address.Contains("STORE")
orderby c.ShipTo descending, c.OrderDate descending
select c, i;
UPDATE
Ich habe eine Abfrage, die Arten funktionieren, aber das dauert es fast zwei Minuten durchführen (im Vergleich zu .02s für die Oracle-Abfrage) und Die Reihenfolge der Ergebnisse ist falsch. Wer sieht was ich vermisse?
var innerQuery = from x in model.Orders
where x.CustomerId == customerId
&& !x.OrderType.Equals("A")
select x.OrderId;
var result = from c in model.CustomerShip
join subQuery in
(
(from o in model.Orders
from c in model.CustomerShip
where c.CustomerId == customerId
&& innerQuery.Contains(o.OrderId)
&& !o.FLAG_ORD_STATUS.Equals("C")
&& c.ShipSeq == o.CustShip
select c.ShipSeq).Distinct()
) on c.ShipSeq equals subQuery into temp
from x in temp.DefaultIfEmpty()
where c.CustomerId == customerId
&& !c.Address.Contains("RETAIL")
&& !c.Address.Contains("STORE")
orderby c.ShipTo descending, c.OrderDate descending
select c;
Lesen Sie sich auf die Join-Fähigkeit von Linq ... Sie können dies umschreiben, um Ihrem SQL sehr ähnlich zu sein, brechen Sie es nicht auf ... –
Ich arbeite mich durch, aber ich bin verwirrt von dieser Zeile: 'AND ShipSeq = i.ShipSeq (+)'. Ist das einzigartig für Oracle? – PixelPaul
@PixelPaul Die '(+)' ist Oracles alte Art, äußere Verbindungen anzuzeigen. Hier ist es bedeutet "Alle Kundendatensätze, plus die Datensätze von der inneren Abfrage, die auf ShipSeq übereinstimmen. Details hier: https://stackoverflow.com/q/6559261/12725 –