linq中left join和inner join的正确用法

之前一直分不清,left join 在linq中应该如何正确的表述,现在决定写篇帖子来记录下来,也许会对你有帮助。

1.inner join

为何先说这个呢,因为,如果你不是很会linq,那么你写出来的linq应该是这种形式的,先看代码:

var query = from a in db.Set().Undeleted(a => a.BsDisFormVerId != null)
                            join d in db.Set().Undeleted() on a.BsDisFormVerId equals d.Id
                            join b in db.Set().Undeleted() on d.FormId equals b.Id
                            join c in db.Set().Undeleted() on b.CertId equals c.Id
                            where a.WorkId == workId && c.CertCode == certCode
                            select new { a.BsDisFormVerId };

这种写法,只返回那些在另一个数据集中具有匹配项的对象。

linq中left join和inner join的正确用法_第1张图片

也可以如下所示:

var q= a.Join(b,T1 => T1.ID,T2 => T2.ID, (T1,T2) => new {
        Name = T1.Name,
        ID=T1.ID,
        NickName = T2.NickName
});

这两种写法的区别是,第一种是用linq查找语句写的,第二种是linq查询方法写的,结果最终肯定相同

2.left join 

sql语句中的left join 在linq中描述的话,和上述语句略有不同,主要是要加一句 into..,如下所示

var cert = from a in db.Set().Undeleted()
                               join b in db.Set() on a.Certcode equals b.CertCode into join1
                               from b in join1.DefaultIfEmpty()
                               where b.CertType == StaticVar.CERT_CLASS && a.JobId == workList.JobId
                               select new { a.Certcode };

其实,在查询时,实际上会将join语句后的匹配结果放到into的对象中,然后在连接在一起。

linq中left join和inner join的正确用法_第2张图片

至此,总结如下:

Linq联接语法

查询方法 查询表达式 语法说明
Join join… in… on …equals… 内部联接。类似于T-SQL 中的inner join。
GroupJoin join…in…on…equals…into… 分组联接,类似于T-SQL中的left join or right join,常用于返回“主键对象-外键对象集合形式查询。


 

 

 

 

有时候,对于相同数据源,inner join 和left join 的结果是相同的,所以linq中怎么写都无所谓,但更多的情况下,这两者的结果差非常明显,所以在写linq时一定要注意使用正确的用法。

你可能感兴趣的:(学习笔记)