2017-06-21 106 views
0

下面是我的SQL查询左外连接,并从三个表拿到三列

SELECT (((((('L' + (CONVERT(NVARCHAR(MAX), t0.Length))) + 'W') + (CONVERT(NVARCHAR(MAX), t0.Width))) + 
       'H') + (CONVERT(NVARCHAR(MAX), t0.Height))) + ' - ') + t0.DimUoM AS 'Dimensions' 
     , (((CONVERT(NVARCHAR(MAX), t0.NetWt)) + ' (') + t0.NetWtUoM) + ')' AS 'Weight' 
     , t0.UPCCode 
     , t1.DisplayBrand AS 'Brand' 
     , t2.ID 
FROM SmartSearchNewQA.dbo.MaterialMaster AS t0 
LEFT OUTER JOIN dbo.BrandConversion AS t1 
     ON t0.Brand = t1.SAPBrand 
LEFT OUTER JOIN ClickCommerce.dbo.tblWarrantyPartReturn AS t2 
     ON t0.MaterialNumber = t2.PartNumber 
LEFT OUTER JOIN ClickCommerce.dbo.tblWarrantyPartReturnAddress AS t3 
     ON t2.ReturnCode = t3.ReturnCode 
WHERE t0.MaterialNumber = 'S1-326000' AND 
     t2.DistributorId = '00100'; 

Query Result

正在尝试上述查询LINQ转换并不能映射第二个表。请找到下面的LINQ我推导到目前为止

from mm in ctx.MaterialMasters 
join bc in ctx.BrandConversions on mm.Brand equals bc.SAPBrand into bc1 
from brandConv in bc1.DefaultIfEmpty() 
join wp1 in ctx.tblWarrantyPartReturns 
    on mm.MaterialNumber equals wp1.PartNumber into bc2 
from partconv in bc2.DefaultIfEmpty() 
join wp2 in ctx.tblWarrantyPartReturnAddresses 
    on bc2 
from partconv2 in bc3.DefaultIfEmpty() 
where mm.MaterialNumber == materialNumber 
select new MaterialHeader 
{ 
    Brand = brandConv.DisplayBrand, 
    Dimensions = "L" + mm.Length + ":W" + mm.Width + ":H" + mm.Height + " - " + mm.DimUoM, 
    UPCCode = mm.UPCCode, 
    Weight = mm.NetWt + " (" + mm.NetWtUoM + ")" 
}) 

请帮助我与LINQ查询到达上述SQL结果。

谢谢

+0

哎呀,该查询是可怕的阅读。所有这些[和]绝对无用的别名使得这个用户充其量是充满敌意的。然后是疯狂的多余的(和)。我知道你试图将它转移到LINQ,但你应该阅读更多关于为什么这些别名是坏的。 http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-table-aliases-like-a-b-c-or-t1-t2-t3.aspx –

回答

0

这是太长的评论,它不会格式正常。以下是使用有意义的别名查看相同的查询的情况。我也删除了所有的redunant括号和方括号。这很容易看到我在做什么。

SELECT 'L' + CONVERT(NVarChar(MAX), mm.Length) + 'W' + CONVERT(NVarChar(MAX), mm.Width) + 'H' + CONVERT(NVarChar(MAX), mm.Height) + ' - ' + mm.DimUoM AS Dimensions 
    , CONVERT(NVarChar(MAX), mm.NetWt) + ' (' + mm.NetWtUoM + ')' AS Weight 
    , mm.UPCCode 
    , bc.DisplayBrand AS Brand 
    , wpr.ID 
FROM SmartSearchNewQA.dbo.MaterialMaster AS mm 
LEFT OUTER JOIN dbo.BrandConversion AS bc ON mm.Brand = bc.SAPBrand 
LEFT OUTER JOIN ClickCommerce.dbo.tblWarrantyPartReturn as wpr on mm.MaterialNumber = wpr.PartNumber 
LEFT OUTER JOIN ClickCommerce.dbo.tblWarrantyPartReturnAddress as wpra on wpr.ReturnCode = wpra.ReturnCode 
WHERE mm.MaterialNumber = 'S1-326000' 
    AND wpr.DistributorId ='00100' 
1

我会尝试这样的事:

from t0 in ctx.MaterialMasters 
join t1 in ctx.BrandConversions 
    on t0.Brand equals t1.SAPBrand into firstLeftJoin 
from m in firstLeftJoin.DefaultIfEmpty() 
join t2 in ctx2.tblWarrantyPartReturns 
    on t2.PartNumber equals m.MaterialNumber into secondLeftJoin 
from n in secondLeftJoin.DefaultIfEmpty() 
join t3 in ctx2.tblWarrantyPartReturnAddress 
    on t3.ReturnCode equals n.ReturnCode into thirdLeftJoin 
from s in thirdLeftJoin.DefaultIfEmpty() 
where t0.MaterialNumber = "S1-326000" && 
    t2.DistributorId = "00100" 
select new MaterialHeader { 
          Brand = t1.DisplayBrand, 
          Dimensions = "L" + t0.Length + ":W" + t0.Width + ":H" + t0.Height + " - " + t0.DimUoM, 
          UPCCode = t0.UPCCode, 
          Weight = t0.NetWt + " (" + t0.NetWtUoM + ")" 
          } 

这引起了我的注意,你有两个数据库:SmartSearchNewQA和ClickCommerce。在你的SQL查询中,所以我使用了两个数据库上下文:ctx和ctx2。假设你将每个数据库分开。

您还可以尝试LINQPad来开发LINQ技能。