首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL 轉 LINQ 實戰:多表連接、子查詢、排序分頁的 Lambda 表達式寫法

     編輯:程式設計綜合問答

原始 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 *。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved