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.bookcase | JOIN bookcase | 要连接的右表 |
第 2 参数 b => b.bcid | ON b.bcid | 左表关联字段 |
第 3 参数 bc => bc.id | = bc.id | 右表关联字段 |
第 4 参数 (b, bc) => ... | SELECT ... | 连接后的结果投影 |
两种写法对比
| 对比项 | 查询语法 | 方法语法(Lambda) |
|---|---|---|
| 可读性 | 接近 SQL,直观易懂 | 链式调用,紧凑 |
| 多表连接 | 写法自然,适合 3 张以上表 | 嵌套 Join 可读性下降 |
| 复杂查询 | group by、into 等支持好 | 需要配合 GroupJoin、SelectMany 等 |
| 学习成本 | 低,会 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,代码可读性明显下降。
Previous: LINQ 中的条件判断(CASE WHEN )
Next: 直接执行 SQL 语句查询