2017-08-22 179 views
0

我需要在linq lambda语法中创建一个LEFT OUTER JOIN。我想创建一个LINQ等效的SQL是:C#Linq Lambda左外部连接

SELECT DISTINCT 
    p.PartNum AS PartNum, p.ShortChar01 AS SkuType, 
    vv.VendorID AS VendorCode, 
    p.PartDescription AS Description, p.Company AS Company 
FROM 
    Part p WITH (NOLOCK) 
INNER JOIN 
    PartPlant pp ON p.Company = pp.Company AND p.PartNum = pp.PartNum 
LEFT OUTER JOIN 
    Vendor vv On pp.VendorNum = vv.VendorNum 
WHERE 
    p.RefCategory = @refCategory 

因此,大家可以看到它的一个非常简单的查询加入了几桌。问题是可能发生的情况是没有供应商,但我们仍然希望剩下的信息因此是左外连接。

我现在试图重现这就是:

_uow.PartService 
    .Get() 
    .Where(p => p.RefCategory.Equals(level2)) 
    .Join(_uow.PartPlantService.Get(), 
      p => new { p.PartNum, p.Company }, 
      pp => new { pp.PartNum, pp.Company }, 
      (p, pp) => new { Part = p, PartPlant = pp }) 
    .GroupJoin(_uow.VendorService.Get(), 
       pprc => pprc.PartPlant.VendorNum, 
       v => v.VendorNum, 
       (pprc, v) => new { PPRC = pprc, V = v }); 

我知道,选择没有返回的时刻相同的字段。现在我已经忽略了这一点,因为我正在努力确保首先获得正确的值。

SQL查询返回41条记录,其中1条记录具有空供应商。 linq查询返回40条记录,显然不会返回具有空供应商的记录。我尝试过使用GroupJoin()DefaultIfEmpty(),但我无法使其工作。

任何帮助将不胜感激。

+0

https://code.msdn.microsoft.com/LINQ-Join-Operators-dabef4e9#leftouterjoin –

+0

那并没有真正提供很多信息。从研究中我发现正确的方法是使用'GroupJoin()',为什么我采取了这种方法。你能解释一下你期望我从中获得什么,而不仅仅是提供一个链接吗? – DaRoGa

+0

https://stackoverflow.com/questions/3404975/left-outer-join-in-linq?rq=1 – Mixxiphoid

回答

0

从评论和user2321864环节,我设法得到它的工作如下:

_uow.PartService.Get().Where(p => p.RefCategory.Equals(level2)) 
           .Join(_uow.PartPlantService.Get(), 
             p => new { p.PartNum, p.Company }, 
             pp => new { pp.PartNum, pp.Company }, 
             (p, pp) => new { Part = p, PartPlant = pp }) 
           .GroupJoin(_uow.VendorService.Get(), 
             pprc => pprc.PartPlant.VendorNum, 
             v => v.VendorNum, 
             (pprc, v) => new { PPRC = pprc, V = v }) 
           .SelectMany(y => y.V.DefaultIfEmpty(), 
              (x, y) => new { PPRC = x.PPRC, Vendor = y }) 
           .Select(r => new Level2Parts() 
           { 
            CompanyCode = r.PPRC.Part.Company, 
            Description = r.PPRC.Part.PartDescription, 
            PartNum = r.PPRC.Part.PartNum, 
            SkuType = r.PPRC.Part.ShortChar01, 
            VendorCode = r.Vendor.VendorID 
           }) 
           .Distinct();