使用Linq进行多表左连接

9

我知道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,
                         };

每个加入的表都可能有“null”字段。能帮我解决吗,谢谢。
1个回答

22

多重连接应该看起来相当类似 - 它变得非常冗长,但我会尝试一下。 在最后的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,
                         };

似乎还有另一种方法可以进行外连接,但是没有测试对象,我甚至不确定是否可以在这种情况下使用它 - 如果您感兴趣,请查看此帖子上的答案: linq中的外连接


3
这种说法的问题在于它的翻译。只有第一个“join”会被翻译成左连接,其他的将是内连接,但条件允许为空。 - Rufix
搜索了几个例子,这个是唯一一个在我的情况下有效的。 - L.T.
4
我不断收到“对象引用未设置为对象实例”的错误提示。 - Scar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接