理解左关联(Left Join)

基础数据准备

首先,我们创建两张测试表并查看数据:

-- 学生表
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 JOINjoin ... into + DefaultIfEmpty()左表显示,右表为 null

LINQ 中的左连接 = join ... into 分组 + DefaultIfEmpty()

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注