2012-06-06 218 views
8

我知道的Linq的左联接是类似这样的:多个表左连接使用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    
   }; 

那么如何对多个连接?这里是我的代码

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

每个连接表可以有“空”字段。可以帮助我,谢谢

回答

18

多联接应该看起来非常相似 - 它变得非常详细,但我会试试这个。 您也可能需要在最终的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, 
         }; 

似乎有做外的另一种方式加入很好,但不必东西来测试它在我什至不知道是否有可能在这种情况下使用它 - 检查出的答案对这个职位如果你有兴趣: outer join in linq

+0

非常感谢你! – pita

+2

这样的陈述的问题是它的翻译。只有第一次连接将被转换为左连接,其他连接将会是内连接,并允许空值。 – Rufix

+0

搜索了几个例子,这是我唯一的例子。 –