之前一直分不清,left join 在linq中应该如何正确的表述,现在决定写篇帖子来记录下来,也许会对你有帮助。
1.inner join
为何先说这个呢,因为,如果你不是很会linq,那么你写出来的linq应该是这种形式的,先看代码:
var query = from a in db.Set<BsWorkFormList>().Undeleted(a => a.BsDisFormVerId != null) join d in db.Set<BsDicFormVersion>().Undeleted() on a.BsDisFormVerId equals d.Id join b in db.Set<BsDicForm>().Undeleted() on d.FormId equals b.Id join c in db.Set<BsDicCert>().Undeleted() on b.CertId equals c.Id where a.WorkId == workId && c.CertCode == certCode select new { a.BsDisFormVerId };
这种写法,只返回那些在另一个数据集中具有匹配项的对象。
也可以如下所示:
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<SmShipCert>().Undeleted() join b in db.Set<BsDicCert>() 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联接语法
查询方法 | 查询表达式 | 语法说明 |
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时一定要注意使用正确的用法。