Linq离开了外部联接,并且联盟返回了许多记录

时间:2017-08-24 20:30:47

标签: linq linq-to-sql linq-to-entities

我将一个运行良好的存储过程转换为linq查询但是没有获得正确的记录。 存储过程如下所示:

SELECT isnull(a.CertificationId, cc.CertificationId) as CertificationId, 
    isnull(a.cipcode, cc.CipCode) as CipCode,isnull(a.Credential, lc.Credential) as Credential, 
    lc.LicensingCertificationProgram, lc.IssuingOrganization, isnull(a.ab, '') as ab
FROM     enrCertificationCipCodes CC INNER JOIN
     lkpCertifications lc ON CC.CertificationId = lc.CertificationId 
     left join
        (SELECT pc.CertificationId, 
        cc.CipCode, 
        lc.Credential, 
        lc.LicensingCertificationProgram, 
        lc.IssuingOrganization, ab = 'Yes',
        pc.psn
            FROM     enrCertificationCipCodes CC INNER JOIN
            lkpCertifications lc ON CC.CertificationId = lc.CertificationId
            inner join (select * from enrProgramCertifications where PSN = @PSN) PC on cc.CertificationId = pc.CertificationId ) as a on a.CertificationId = cc.CertificationId 
where cc.CipCode = @CipCode 
union
select pc.CertificationId as CertificationId, p.cipcode as CipCode, other as Credential,'' as LicensingCertificationProgram, 
   '' as IssuingOrganization, 'Yes' as ab
 from (select * from enrProgramCertifications where CertificationId  = '99999') pc join enrProgram p on pc.PSN = p.PSN 
  where p.CIPCode = @CipCode and p.PSN = @PSN
  Union
select '99999' as CertificationId, @CipCode as CipCode, 'Other' as Credential,'' as LicensingCertificationProgram, '' as IssuingOrganization, '' as ab
order by ab desc, Credential

我的linq查询是

var t = ((from a in LkpCertifications 
        join d in EnrProgramCertifications on a.CertificationId equals d.CertificationId into ad
                 from d in ad.DefaultIfEmpty()
                 join c in EnrCertificationCipCodes on a.CertificationId equals c.CertificationId
                 where c.CipCode == "52.1999"
                 select new {
                 CertificationId = a.CertificationId,
                 CipCode = c.CipCode,
                 Credential = a.Credential,
                 Licensing = a.LicensingCertificationProgram,
                 IssuingOrganization = a.IssuingOrganization,
                 Psn = d.PSN != null ? d.PSN : 0,
                 ab = d.PSN != null ? "Yes" : ""
                 })
                 .Union (from k in EnrProgramCertifications
                 join l in LkpCertifications on k.CertificationId equals l.CertificationId where k.PSN == 19480
                 select new{
                 CertificationId = k.CertificationId,
                 CipCode = "52.1999",
                 Credential = k.Other,
                 Licensing = l.LicensingCertificationProgram,
                 IssuingOrganization = l.IssuingOrganization,
                 Psn = k.PSN != null ? k.PSN : 0,
                 ab = k.PSN != null ? "Yes" : ""
                 })).ToList();

t.Dump(); 

结果是我从左连接表中获得了更多行。如果我尝试通过使用PSN编号限定左边连接表中的行,那么我就不会从lkpCertifications表中获得结果。 lkpCertifications持有所有认证,并且enrProgramCertifications仅保留那些已经选择的订单和订单设置。

所以我目前的结果看起来像

Queryresult

我应该只获得一个带有0 PSN的单个项目54和一个PSN为19480的单个55记录。

关于这个问题的任何想法?

1 个答案:

答案 0 :(得分:0)

我能够通过使用几个连接到defaultifempty()返回左外连接的对象来解决这个问题。

                certs = (from a in _context.LkpCertifications
                     join d in _context.EnrProgramCertifications on a.CertificationId equals d.CertificationId into ad
                     from d in ad.DefaultIfEmpty()
                     join c in _context.EnrCertificationCipCodes on a.CertificationId equals c.CertificationId into ac
                     from c in ac.DefaultIfEmpty()
                     where c.CipCode == CIP || d.Psn == Psn
                     select new vmManageCertifications
                         {
                         Psn = d.Psn == Psn ? d.Psn : 0,
                         Cipcode = c.CipCode == null ? "0" : c.CipCode,
                         CertificationId = a.CertificationId,
                         Credential = a.Credential == "Other" ? d.Other : a.Credential,
                         LicensingCertificationProgram = a.LicensingCertificationProgram,
                         IssuingOrganization = a.IssuingOrganization,
                         ProgramCertified = d.Psn == Psn ? true : false
                         }).ToList().GroupBy(i => i.CertificationId).Select(group => group.First()).OrderByDescending(i => i.ProgramCertified);