2012-06-06 24 views
8

Sé izquierda del Linq unión es similar como esto:Varias tablas combinación izquierda usando 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    
   }; 

entonces ¿qué hay de lo múltiple se unen? aquí está mi código

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, 
         }; 

cada tabla unida podría tener el campo "nulo". puede ayudarme, gracias

Respuesta

18

La combinación múltiple debería ser bastante similar, se vuelve bastante detallada, pero me gustaría probarlo. Es posible que necesite alguna comprobación nula en la línea final where también.

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, 
         }; 

Parece que hay otra forma de hacer las combinaciones externas también, pero sin tener algo para probarlo en que ni siquiera estoy seguro de si es posible utilizarlo en este caso - echa un vistazo a la respuesta en este post si estás interesado: outer join in linq

+0

¡Muchas gracias! – pita

+2

El problema con tal declaración es su traducción. Solo la primera unión se traducirá como unión a la izquierda, mientras que otras se unirán a las condiciones para permitir nulos. – Rufix

+0

Ha buscado algunos ejemplos, este es el único que funciona en mi caso. –

Cuestiones relacionadas