2017-08-24 8 views
0

Je convertis une procédure stockée qui fonctionne bien dans une requête linq mais ne récupère pas les enregistrements corrects. La procédure stockée se présente comme suit:Linq a quitté la jointure externe et un syndicat a renvoyé plusieurs enregistrements.

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 

La requête LINQ J'est

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(); 

Le résultat est que je reçois plus de lignes de la table jointe gauche. Si j'essaie de limiter les lignes de la table jointe gauche en le qualifiant avec le numéro PSN, je n'obtiens pas les résultats de la table lkpCertifications. Le lkpCertifications détient toutes les certifications et les enrProgramCertifications ne contiennent que celles qui ont été sélectionnées comme une commande et un ordre de livraison.

donc mes résultats actuels ressemble

Queryresult

Je devrais obtenir un seul élément 54 avec un 0 PSN et un 55 enregistrement avec un PSN de 19480.

Toutes les idées de le problème?

Répondre

0

J'ai été capable de résoudre ce problème en utilisant un couple joint dans des objets qui defaultifempty() pour retourner les jointures externes gauche.

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