表关联的两种写法:查询语法 vs 方法语法(Lambda)

SQL 中的连接

SELECT * FROM book b
JOIN bookcase AS bc
ON b.bcid = bc.idCode language: PHP (php)

方式一:查询语法(Query Syntax)

using (var db = new DataClasses1DataContext())
{
    var q = from b in db.book
            join bc in db.bookcase
            on b.bcid equals bc.id
            select new { b, bc };

    var res = q.ToList();
}Code language: JavaScript (javascript)

方式二:方法语法(Lambda / Method Syntax)

using (var db = new DataClasses1DataContext())
{
    var res2 = db.book
        .Join(db.bookcase,
              b => b.bcid,           // 左表关联键
              bc => bc.id,           // 右表关联键
              (b, bc) => new { b, bc }  // 结果投影
        )
        .ToList();
}Code language: PHP (php)

Join 方法签名解析

db.book.Join(
    db.bookcase,                        // 右表(内连接的目标)
    b => b.bcid,                        // outerKeySelector:左表的键
    bc => bc.id,                        // innerKeySelector:右表的键
    (b, bc) => new { b, bc }            // resultSelector:投影结果
)Code language: PHP (php)
参数对应 SQL说明
第 1 参数 db.bookcaseJOIN bookcase要连接的右表
第 2 参数 b => b.bcidON b.bcid左表关联字段
第 3 参数 bc => bc.id= bc.id右表关联字段
第 4 参数 (b, bc) => ...SELECT ...连接后的结果投影

两种写法对比

对比项查询语法方法语法(Lambda)
可读性接近 SQL,直观易懂链式调用,紧凑
多表连接写法自然,适合 3 张以上表嵌套 Join 可读性下降
复杂查询group byinto 等支持好需要配合 GroupJoinSelectMany
学习成本低,会 SQL 就能上手需理解委托和 Lambda 表达式
最终 SQL两者生成的 SQL 完全一致两者生成的 SQL 完全一致

多表连接对比

查询语法(推荐多表时使用):

var q = from b in db.book
        join bc in db.bookcase on b.bcid equals bc.id
        join bl in db.booklabel on b.id equals bl.bid
        select new { b, bc, bl };Code language: JavaScript (javascript)

方法语法(嵌套 Join):

var res = db.book
    .Join(db.bookcase, b => b.bcid, bc => bc.id, (b, bc) => new { b, bc })
    .Join(db.booklabel, x => x.b.id, bl => bl.bid, (x, bl) => new { x.b, x.bc, bl })
    .ToList();Code language: PHP (php)

可以看到,方法语法在连接第三张表时需要引入匿名类型 x,代码可读性明显下降。

发表回复

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