需依使用者選擇動態排序/篩選欄位時,純 LINQ 難以表達:
// 錯誤:OrderBy 不接受字串
var q = db.Customers.OrderBy("CompanyName");
// 解法 1:Switch 分支(維護性差)
switch (sortField) {
case "ID": q = q.OrderBy(c => c.ID); break;
case "Name": q = q.OrderBy(c => c.Name); break;
}
// 解法 2:Dynamic LINQ Library (System.Linq.Dynamic)
using System.Linq.Dynamic;
var q = db.Customers.OrderBy("CompanyName").Where("City == @0 AND Orders.Count >= @1", "London", 10);
Dynamic LINQ 內部以運算式樹動態建構,效能略低但彈性極高。
SubmitChanges() 逐筆發送 UPDATE/DELETE,大量資料極慢。
// 解法:ExecuteCommand 直接下 SQL 批次更新
db.ExecuteCommand("UPDATE Products SET UnitPrice = UnitPrice + 1.00 WHERE Discontinued = 0");
或使用 ExecuteQuery<T>() 回傳實體集合。
DataLoadOptions.LoadWith 預載。| 技巧 | 說明 |
|---|---|
| DataLoadOptions | 預先載入關聯實體,避免 N+1 |
| CompiledQuery | 預編譯常用查詢,減少運算式樹建構開銷 |
| 投影 | Select new { ... } 只取需要欄位,減少網路傳輸 |
| AsNoTracking | 唯讀查詢停用追蹤,節省記憶體 |
| 分頁 | Skip/Take 轉為 ROW_NUMBER(),避免全表掃描 |
LINQ to SQL 降低了資料存取門檻,但非銀彈。理解其運作機制(運算式樹、延遲載入、變更追蹤),在動態查詢用 Dynamic LINQ,批次操作用 ExecuteCommand,複雜報表用 View/SP,才能發揮最大效益。技術選型應依專案規模、團隊技能、效能需求綜合判斷,「揚長避短,才是正道。」