原始 SQL
SELECT TOP 3 *
FROM [dbo.Users]
WHERE id IN (SELECT id FROM [dbo.Topics] WHERE userid = 1)
ORDER BY lastactivetime
LINQ Lambda 寫法(推薦)
var query = db.Topics
.Where(t => t.userid == 1)
.SelectMany(t => db.Users.Where(u => u.id == t.id)) // 等價於 IN 子查詢連接
.OrderBy(u => u.lastactivetime)
.Take(3);
查詢語法寫法(贊同 SQL 風格)
var query = from t in db.Topics
where t.userid == 1
join u in db.Users on t.id equals u.id
orderby u.lastactivetime
select u
take 3;
關鍵點對照表
| SQL 子句 | LINQ 方法 | 備註 |
| SELECT TOP 3 | .Take(3) | 生成 SQL TOP (3) / LIMIT 3 |
| WHERE id IN (subquery) | .SelectMany() + Where() | 或用 .Join()、.Any() 視具體 ORM 生成 SQL 優化 |
| ORDER BY col | .OrderBy(u => u.col) | 降序用 .OrderByDescending() |
| 多表關聯 | .Join() / .GroupJoin() / 導航屬性 | Entity Framework 支持導航屬性自動連接 |
性能提示
SelectMany 可能生成 CROSS APPLY 或 EXISTS,視數據庫 Provider(EF Core / LINQ to SQL)優化策略不同。
- 若
Topics.id 非主鍵,建議先 .Select(t => t.id).Distinct() 減少重複連接。
- 僅需特定列時用
.Select(u => new { u.Id, u.Name }) 避免 SELECT *。