Linq的Join链

时间:2019-06-13 14:19:04

标签: c# linq

我有这种情况:

SELECT I.CHFID InsuranceNumber, I.OtherNames, I.LastName, I.DOB BirthDate, I.Gender, F.Poverty PoveryStatus, C.ConfirmationTypeCode ConfirmationType, F.FamilyType GroupType, F.FamilyAddress PermanentAddress, I.Marital MaritalStatus, I.CardIssued BeneficiaryCard, l.LocationCode CurrentVillageCode, I.CurrentAddress CurrentAddress, P.Profession, I.Education, I.Phone PhoneNumber, I.Email, I.TypeOfId IdentificationType, I.passport IdentificationNumber, HF.HFCode FSPCode  FROM tblFamilies F
LEFT OUTER JOIN tblInsuree I ON F.InsureeID = I.InsureeID
LEFT OUTER JOIN tblLocations L ON L.LocationId = F.LocationId
LEFT OUTER JOIN tblConfirmationTypes C ON C.ConfirmationTypeCode =F.ConfirmationType
LEFT OUTER JOIN tblFamilyTypes G ON G.FamilyTypeCode= F.FamilyType
LEFT OUTER JOIN tblProfessions P ON P.ProfessionId= I.Profession
LEFT OUTER JOIN tblHF HF ON HF.HfID=I.HFID
WHERE 
I.CHFID=@CHFID

我是用LINQ编写的:

var x = imisContext.TblFamilies
                        .Join(imisContext.TblInsuree,
                            f => f.InsureeId,
                            i => i.InsureeId,
                            (f, i) => new { TblFamilies = f, TblInsuree = i })
                        .Join(imisContext.TblLocations,
                            l => l.TblFamilies.LocationId,
                            i => i.LocationId,
                            (f, i) => new { TblFamilies = f, TblLocations = i })
                        .Join(imisContext.TblConfirmationTypes,
                            c => c.TblFamilies.TblFamilies.ConfirmationType,
                            i => i.ConfirmationType,
                            (c, i) => new { TblFamilies = c, TblConfirmationTypes = i })
                        .Join(imisContext.TblFamilyTypes,
                            c => c.TblFamilies.TblFamilies.TblFamilies.FamilyType,
                            i => i.FamilyType,
                            (c, i) => new { TblFamilies = c, TblFamilyTypes = i })
                        .Join(imisContext.TblProfessions,
                            c => c.TblFamilies.TblFamilies.TblFamilies.TblInsuree.Profession,
                            i => i.ProfessionId,
                            (c, i) => new { TblInsuree = c, TblProfessions = i })
                        .Join(imisContext.TblHf,
                            c => c.TblInsuree.TblFamilies.TblFamilies.TblFamilies.TblInsuree.Hfid,
                            i => i.HfId,
                            (c, i) => new { TblInsuree = c, TblHf = i })
                        .Where(r => r.TblInsuree.TblInsuree.TblFamilies.TblFamilies.TblFamilies.TblInsuree.Hfid == insureeNumberINT);

我对此有疑问:

c => c.TblInsuree.TblFamilies.TblFamilies.TblFamilies.TblInsuree.Hfid

应该是这样吗? 这些表中的嵌套太多

这只是整体的一部分

1 个答案:

答案 0 :(得分:-1)

加入时,不要扁平化,而是加入时扁平化:

var ans = imisContext.TblFamilies
                     .Join(imisContext.TblInsuree,
                         f => f.InsureeId,
                         i => i.InsureeId,
                         (f, i) => new { TblFamilies = f, TblInsuree = i })
                     .Join(imisContext.TblLocations,
                         fi => fi.TblFamilies.LocationId,
                         l => l.LocationId,
                         (fi, l) => new { fi.TblFamilies, fi.TblInsuree, TblLocations = l })
                     .Join(imisContext.TblConfirmationTypes,
                         fil => fil.TblFamilies.ConfirmationType,
                         c => c.ConfirmationType,
                         (fil, c) => new { fil.TblFamilies, fil.TblInsuree, fil.TblLocations, TblConfirmationTypes = c })
                     .Join(imisContext.TblFamilyTypes,
                         filc => filc.TblFamilies.FamilyType,
                         ft => ft.FamilyType,
                         (filc, ft) => new { filc.TblFamilies, filc.TblInsuree, filc.TblLocations, filc.TblConfirmationTypes, TblFamilyTypes = ft })
                     .Join(imisContext.TblProfessions,
                         filcft => filcft.TblInsuree.Profession,
                         p => p.ProfessionId,
                         (filcft, p) => new { filcft.TblFamilies, filcft.TblInsuree, filcft.TblLocations, filcft.TblConfirmationTypes, filcft.TblFamilyTypes, TblProfessions = p })
                     .Join(imisContext.TblHf,
                         c => c.TblInsuree.Hfid,
                         h => h.HfId,
                         (filcftp, h) => new { filcftp.TblFamilies, filcftp.TblInsuree, filcftp.TblLocations, filcftp.TblConfirmationTypes, filcftp.TblFamilyTypes,filcftp.TblProfessions, TblHf = h })
                     .Where(filcftph => filcftph.TblInsuree.Hfid == insureeNumberINT);

在这种情况下,查询语法具有优势,因为它可以透明地处理扁平化:

var qans = from f in imisContext.TblFamilies
           join i in imisContext.TblInsuree on f.InsureeId equals i.InsureeId
           join l in imisContext.TblLocations on f.LocationId equals l.LocationId
           join c in imisContext.TblConfirmationTypes on f.ConfirmationType equals c.ConfirmationType
           join ft in imisContext.TblFamilyTypes on f.FamilyType equals ft.FamilyType
           join p in imisContext.TblProfessions on i.Profession equals p.ProfessionId
           join h in imisContext.TblHf on i.Hfid equals h.HfId
           where i.Hfid == insureeNumberINT
           select new { f, i, l, c, ft, p, h };