将sql转换为linq(连接和分组)

时间:2017-06-14 13:35:39

标签: linq

我正在将一个旧的webforms应用程序转换为asp.net mvc,我遇到了将我的一个sql语句转换为linq的问题。特别是,我需要有关分组和连接的帮助。我通过查看各种示例尝试了几种方法,但没有一种方法适合我。

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

2 个答案:

答案 0 :(得分:0)

这显然是未经测试的,当由于左连接而可能不存在时尝试访问字段可能会出现空问题(例如SUM(ShippingInput.Qty)),这就是我将一些测试移到lambda的原因Where

上的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) }

答案 1 :(得分:0)

LINQ版

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版

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 ";