2012-06-06 16 views
8

So sinistra del Linq join è simile in questo modo:Più tabelle LEFT JOIN utilizzando Linq

var q=from e in db.Employes    
     join o in db.Orders on e equals o.Emoloyee into ords   
     from on in ords.DefautIfEmpty() 
     select new 
     {       
     e.FirstName,      
     e.LastName    
   }; 

allora come circa il multiplo unirsi? ecco il mio codice

var personalInfoQuery = from t in crnnsupContext.Tombstones 
         join p in crnnsupContext.ProvStates on t.ProvinceState equals p.ProvinceStateID 
         join n in crnnsupContext.NursingSchools on t.NursingSchool equals n.SchoolID 
         join i in crnnsupContext.InitialEducations on t.InitialEducation equals SqlFunctions.StringConvert((double)i.InitalEducationID, 1) 
         join g in crnnsupContext.tbl_GraduatedProvCountry on t.GradPovCountry equals g.id 
         where t.RegNumber == _username 
         select new CPersonalInfo 
         { 
          ProvState = p, 
          Tombstone = t, 
          NursingSchool = n, 
          InitialEducation = i, 
          GraduatedProvCountry = g, 
         }; 

ogni tabella unita potrebbe avere campo "null". può aiutarmi, grazie

risposta

18

Il join multiplo dovrebbe sembrare abbastanza simile - diventa piuttosto prolisso, ma vorrei provarlo. Potrebbe essere necessario qualche controllo nulla nella riga finale where.

var personalInfoQuery = from t in crnnsupContext.Tombstones 
         join p in crnnsupContext.ProvStates on t.ProvinceState equals p.ProvinceStateID into group1 
         from g1 ini group1.DefaultIfEmpty() 
         join n in crnnsupContext.NursingSchools on g1.NursingSchool equals n.SchoolID into group2 
         from g2 in group2.DefaultIfEmpty() 
         join i in crnnsupContext.InitialEducations on g2.InitialEducation equals SqlFunctions.StringConvert((double)i.InitalEducationID, 1) into group3 
         from g3 in group3.DefaultIfEmpty() 
         join g in crnnsupContext.tbl_GraduatedProvCountry on g3.GradPovCountry equals g.id into group4 
         from g4 in group4.DefaultIfEmpty() 
         where g4 == null || g4.RegNumber == _username 
         select new CPersonalInfo 
         { 
          ProvState = p, 
          Tombstone = t, 
          NursingSchool = n, 
          InitialEducation = i, 
          GraduatedProvCountry = g, 
         }; 

Sembra che ci sia un altro modo di fare outer join come pure, ma senza avere qualcosa di provarlo in poi non sono nemmeno sicuro se è possibile utilizzarlo in questo caso - check out la risposta su questo post Se sei interessato: outer join in linq

+0

Grazie mille !! – pita

+2

Il problema con questa affermazione è la sua traduzione. Solo il primo join sarà tradotto come join sinistro, altri saranno inner join con condizioni per consentire i null. – Rufix

+0

Ho cercato alcuni esempi, questo è l'unico che funziona nel mio caso. –