面對 NHibernate、NBear、Castle 等第三方 ORM,LINQ to SQL (隨 .NET 3.5/VS2008 內建) 擁有三大優勢:
澄清迷思:LINQ ≠ LINQ to SQL。LINQ 是語言層面的查詢語法 (Data Iterative Engine);LINQ to SQL 是其在資料庫存取上的應用框架。微軟雖主推 EF,但 LINQ to SQL 會長期保留於 .NET Framework 相容性中。
SQL Server Express 2005,建立 MyBulletin 資料庫,兩張表:
Category (公告分類)Bulletin (公告內容)一對多關聯:一個分類對多條公告。

VS2008 → Class Library 專案 LinqToSqlDemo.Orm → 右鍵 Add → New Item → LINQ to SQL Classes → 命名 DataClasses.dbml。

MyBulletin。Category、Bulletin 拖曳至 DBML 設計面。

生成檔案:DataClasses.designer.cs (實體類別 + DataContext)、app.config (連線字串)。
新增 Console 專案 LinqToSqlDemo.Test,參考 LinqToSqlDemo.Orm 與 System.Data.Linq。
using System;
using System.Linq;
using LinqToSqlDemo.Orm;
namespace LinqToSqlDemo.Test
{
class Program
{
private static DataClassesDataContext db = new DataClassesDataContext();
static void Main()
{
Console.WriteLine("=== LINQ to SQL 測試 ===\n");
// Insert
Console.WriteLine("=== 測試 Insert ===");
TestInsert(); Output();
// Delete
Console.WriteLine("=== 測試 Delete ===");
TestDelete(); Output();
// Update
Console.WriteLine("=== 測試 Update ===");
TestUpdate(); Output();
Console.ReadLine();
}
private static void Output()
{
foreach (var c in db.Categories)
Console.WriteLine($"分類 {c.ID}:{c.Name}");
var sport = db.Categories.Single(c => c.Name == "體育新聞");
foreach (var b in sport.Bulletins)
{
Console.WriteLine($"標題:{b.Title}");
Console.WriteLine($"內容:{b.Content}");
Console.WriteLine($"日期:{b.Date}");
Console.WriteLine($"分類:{b.Category1.Name}");
}
}
private static void TestInsert()
{
var cat1 = new Category { Name = "國際要聞" };
var cat2 = new Category { Name = "體育新聞" };
var cat3 = new Category { Name = "財經快報" };
var bull1 = new Bulletin { Title = "曼聯晉級冠軍杯四強", Content = "曼聯晉級冠軍杯四強", Date = DateTime.Now };
var bull2 = new Bulletin { Title = "18:00直播亞冠首爾VS山東", Content = "18:00直播亞冠首爾VS山東,敬請期待!!!", Date = DateTime.Now };
cat2.Bulletins.Add(bull1);
cat2.Bulletins.Add(bull2);
db.Categories.InsertOnSubmit(cat1);
db.Categories.InsertOnSubmit(cat2);
db.Categories.InsertOnSubmit(cat3);
db.SubmitChanges(); // Unit of Work 模式:統一提交
}
private static void TestDelete()
{
db.Categories.DeleteOnSubmit(db.Categories.Single(c => c.Name == "國際要聞"));
db.SubmitChanges();
}
private static void TestUpdate()
{
var finance = db.Categories.Single(c => c.Name == "財經快報");
finance.Name = "財經新聞";
db.SubmitChanges();
}
}
}

| 操作 | 模式 | 關鍵方法 |
|---|---|---|
| 取得 DataContext | Gateway | new DataClassesDataContext() |
| 查詢單筆 | Lambda | db.Categories.Single(c => c.ID == 3) |
| 查詢全部 | 集合屬性 | db.Categories |
| 條件查詢+排序 | LINQ 查詢語法 | from b in db.Bulletins where b.Category==3 orderby b.ID descending select b |
| 分頁 | Skip/Take | query.Skip(pageSize*(pageNo-1)).Take(pageSize).ToList() |
| 新增 | Unit of Work | InsertOnSubmit(entity); SubmitChanges() |
| 刪除 | Unit of Work | DeleteOnSubmit(entity); SubmitChanges() |
| 修改 | 追蹤變更 | entity.Property = val; SubmitChanges() |
DBML 自動映射一對多:Category.Bulletins (集合) ↔ Bulletin.Category1 (單一反向參考,名稱衝突自動加尾碼 1)。
四步驟完成 ORM 建置與 CRUD 操作。LINQ to SQL 以輕量、直覺、高生產力著稱,中小專案首選。進階功能 (預載入、優化 SQL、預存程序映射等) 請參考 MSDN 文檔。
原文出處:leoo2sk.cnblogs.com
完整代碼下載:LinqToSqlDemo.rar