2017-06-14 3 views
-1

Ich konvertiere eine alte Webforms App zu asp.net mvc und ich habe Probleme, eine meiner SQL-Anweisungen in Linq konvertieren. Insbesondere brauche ich Hilfe beim Gruppieren und Joins. Ich habe verschiedene Wege ausprobiert, indem ich hier verschiedene Beispiele angeschaut habe und keine hat für mich funktioniert.Konvertierung von SQL zu Linq (Joins und Gruppe von)

SELECT cp.PartNumber, cp.PartDescription, PFEP.PFEPTx, PFEP.KBQty, 
TX_QOH.QOH, TX_ReworkQOH.Rework_QOH as Rework, SUM(ShippingInput.Qty) AS 
'Ocean' 
FROM CustomerParts as cp 

LEFT JOIN TX_QOH 
ON cp.PartNumber = TX_QOH.PN 

LEFT JOIN TX_ReworkQOH 
ON cp.PartNumber = TX_ReworkQOH.PN 

LEFT JOIN ShippingInput 
ON cp.PartNumber = ShippingInput.PN AND ShippingInput.Status <> 'Received' 

LEFT JOIN PFEP 
ON cp.PartNumber= PFEP.PN 

WHERE cp.PartType = 'Actuator Part' AND cp.Division = 'Bayne' AND cp.Active 
= 'Yes' AND TX_QOH.QOH = '0' 

Group By cp.PartNumber, TX_QOH.QOH, TX_ReworkQOH.Rework_QOH, 
cp.PartDescription, PFEP.PFEPTx, PFEP.KBQty 
Order By cp.PartNumber ASC 
+0

formatieren Sie den Code, vielleicht? –

+0

Die Leute helfen eher dabei, einen Übersetzungsversuch zu beheben, als die Übersetzung für Sie zu schreiben – jhhoff02

+0

* Machen Sie das nicht. Das ist ein ernsthafter Fehler. LINQ to SQL oder LINQ to Entities ist eine Abfragesprache für ein ORM, kein Ersatz für SQL. Sie können LINQ ohne ORM nicht verwenden. Erstellen Sie geeignete Entities mit Relationen und Navigationseigenschaften und überlassen Sie dem ORM die Aufgabe, verwandte Zeilen abzugleichen und sie an Objekte weiterzugeben –

Antwort

0

LINQ Version

var queryNew = (from cp in db.MasterPartLists 
      join tx in db.TxQohs on cp.CustomerPn equals tx.Pn into jTxQoh 
      from tx in jTxQoh.DefaultIfEmpty() 
      join c in db.ShipIns.Where(r => r.ShipInStatusId != 3) on cp.CustomerPn equals c.Pn into jShipIns 
      from c in jShipIns.DefaultIfEmpty() 
      join d in db.Pfeps on cp.CustomerPn equals d.CustomerPn into jPfeps 
      from d in jPfeps.DefaultIfEmpty() 
      where d.PartTypeId == parttype && cp.CustomerDivisionId == division && cp.ActivePartId == 1 && tx.Qoh == 0 
      group new {cp, d, tx, c} by new {cp.CustomerPn, tx.Qoh, cp.PartDescription, d.PfepTx, d.KbQty} 
      into gcp 
      orderby gcp.Key.CustomerPn 
      select new 
      { 
       gcp.Key.CustomerPn, 
       gcp.Key.PartDescription, 
       gcp.Key.PfepTx, 
       gcp.Key.KbQty, 
       gcp.Key.Qoh, 
       Ocean = (int?)gcp.Sum(r => r.c.Qty) 
      }); 

SQL Version

var queryNew = "SELECT cp.CustomerPn, cp.PartDescription, Pfeps.PFEPTx, Pfeps.KBQty, TxQohs.Qoh, SUM(ShipIns.Qty) AS 'Ocean' " 
          + "FROM MasterPartLists as cp " 
          + "LEFT JOIN TxQohs " 
          + "ON cp.CustomerPn = TxQohs.Pn AND TxQohs.Qoh = '0' " 
          + "LEFT JOIN ShipIns " 
          + "ON cp.CustomerPn = ShipIns.Pn AND ShipIns.ShipStatusId <> '3' " 
          + "LEFT JOIN Pfep " 
          + "ON cp.CustomerPn = Pfeps.CustomerPn " 
          + "WHERE cp.PartTypeId = parttype AND cp.CustomerDivisionId = division AND cp.ActivePartId = '1' " 
          + "Group By cp.CustomerPn, TxQohs.Qoh, cp.PartDescription, Pfeps.PfepTx, Pfeps.KbQty " 
          + "Order By cp.CustomerPn ASC "; 
0

Dies ist offensichtlich nicht getestet, und es kann null Probleme sein mit dem Versuch, Felder zuzugreifen, wenn sie nicht auf der linken Seite existieren können beitreten (zB SUM (ShippingInput.Qty)), weshalb ich einige bewegt die Tests auf Lambda Where auf dem join

from cp in CustomerParts 
join r_tx_qoh in TX_QOH.Where(r => r.QOH == "0") on cp.PartNumber equals r_tx_qoh.PN into j_tx_qoh 
from r_tx_qoh in j_tx_qoh.DefaultIfEmpty() 
join r_tx_reworkqoh in TX_ReworkQOH on cp.PartNumber equals r_tx_reworkqoh.PN into j_tx_reworkqoh 
from r_tx_reworkqoh in j_tx_reworkqoh.DefaultIfEmpty() 
join r_shippinginput in ShippingInput.Where(r => r.Status != "Received") on cp.PartNumber equals r_shippinginput.PN into j_shippinginput 
from r_shippinginput in j_shippinginput.DefaultIfEmpty() 
join r_pfep in PFEP on cp.PartNumber equals r_pfep.PN into j_pfep 
from r_pfep in j_pfep.DefaultIfEmpty() 
where cp.PartType == "Actuator Part" && cp.Division == "Bayne" && cp.Active == "Yes" 
group new { cp, r_pfep, r_tx_qoh, r_tx_reworkqoh, r_shippinginput } by new { cp.PartNumber, r_tx_qoh.QOH, r_tx_reworkqoh.Rework_QOH, cp.PartDescription, r_pfep.PFEPTx, r_pfep.KBQty } into gcp 
orderby gcp.Key.PartNumber 
select new { gcp.Key.PartNumber, gcp.Key.PartDescription, gcp.Key.PFEPTx, gcp.Key.KBQty, tcp.Key.QOH, Rework = gcp.Key.Rework_QOH, Ocean = gcp.Sum(r => r.r_shippinginput.Qty) } 
+0

Dank NetMage. Das hat mich sehr nahe gebracht. Hier finden Sie die entsprechenden Arbeitsanleitungen. – Zhongwenslayer