基础数据准备
首先,我们创建两张测试表并查看数据:
-- 学生表
SELECT * FROM Student;
-- 产品表
SELECT * FROM [LinqSqlDemo].[dbo].[Product];Code language: CSS (css)
示例数据:
| 学生姓名 | 产品信息 |
|---|---|
| 张三 | 沙发 999, 跑步机 888 |
内连接(Inner Join)原理
SELECT * FROM Student s
INNER JOIN Product AS p
ON s.ID = p.SidCode language: PHP (php)
说明:
INNER JOIN(等同于JOIN)的逻辑是——A 表的每条记录都要和 B 表的每条记录逐一比较,如果发现ON后面的条件成立,就将这条匹配的记录显示出来。不匹配的记录会被过滤掉。
左连接(Left Join)原理
-- 左表连接
-- 左边的表,就算和右边的表一条都没匹配到,也要列出左表的记录
-- 但是右边表的字段就显示为 NULL
SELECT * FROM Student s
LEFT JOIN Product AS p
ON s.ID = p.SidCode language: PHP (php)
核心要点:
- 左表(Student)的所有记录无论如何都会显示
- 如果右表(Product)没有匹配的记录,右表字段以
NULL填充
在 LINQ 中实现左关联
static void Main(string[] args)
{
using (var db = new DataClasses1DataContext())
{
var query = from s in db.Student
join p in db.Product
on s.ID equals p.Sid into g
from g2 in g.DefaultIfEmpty()
select new { s, g2 };
var result = query.ToList();
}
}Code language: JavaScript (javascript)
LINQ 左连接语法解析:
步骤 代码 说明 ① join p in db.Product on s.ID equals p.Sid into g将匹配的右表记录分组到 g中② from g2 in g.DefaultIfEmpty()从分组中取记录,若无匹配则返回 null(类似 SQL 的LEFT JOIN)③ select new { s, g2 }投影结果,左表对象 s始终有值,右表对象g2可能为null
总结对比
| 连接类型 | SQL 关键字 | LINQ 实现方式 | 未匹配时的行为 |
|---|---|---|---|
| 内连接 | INNER JOIN | 直接 join ... on ... | 不显示该记录 |
| 左连接 | LEFT JOIN | join ... into + DefaultIfEmpty() | 左表显示,右表为 null |
LINQ 中的左连接 =
join ... into分组 +DefaultIfEmpty()。
Previous: Inner Join表连接
Next: 分组合并行