LINQ (Language Integrated Query) 為 .NET 提供統一查詢語法,解決不同資料來源(SQL、XML、記憶體集合)存取方式不一的問題。本文從零開始,手寫實體類別對應資料表,示範基本增刪改查操作。
using System.Data.Linq;
using System.Data.Linq.Mapping; // 需參考 System.Data.Linq.dll
[Table(Name = "Employees")]
public class Employee {
[Column(IsDbGenerated = true, IsPrimaryKey = true)]
public int EmployeeID { get; set; }
[Column(Name = "FirstName", DbType = "nvarchar(20)")]
public string FirstName { get; set; }
[Column(Name = "LastName", DbType = "nvarchar(20)")]
public string LastName { get; set; }
// 可加入其他欄位:Title, HireDate, City, Country 等
}
| 屬性 | 用途 |
|---|---|
| Name | 資料庫欄位名稱(若與屬性名不同) |
| DbType | 精確指定資料庫型別,如 nvarchar(50) |
| IsPrimaryKey | 標記主鍵欄位 |
| IsDbGenerated | 標記 Identity / 自動產生欄位 |
| CanBeNull | 允許 NULL 值 |
| Storage | 指定私有備份欄位名,啟用延遲載入最佳化 |
| UpdateCheck | 樂觀並行控制:Never / Always / WhenChanged |
// 連接字串從 web.config 讀取
string connStr = ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
using (var db = new DataContext(connStr)) {
// 取得型別化 Table
Table<Employee> employees = db.GetTable<Employee>();
// --- 查詢 ---
var londonEmps = from e in employees
where e.City == "London"
select e;
// --- 新增 ---
var newEmp = new Employee { FirstName = "Tom", LastName = "Chen" };
employees.InsertOnSubmit(newEmp);
db.SubmitChanges(); // 寫入 DB,newEmp.EmployeeID 回填自增值
// --- 修改 ---
var emp = employees.Single(e => e.EmployeeID == 1);
emp.LastName = "Wang";
db.SubmitChanges();
// --- 刪除 ---
var toDel = employees.Single(e => e.EmployeeID == 99);
employees.DeleteOnSubmit(toDel);
db.SubmitChanges();
}
SubmitChanges() 時一次交易提交DataLoadOptions.LoadWith 預先載入public class NorthwindDataContext : DataContext {
public NorthwindDataContext() :
base(ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString) { }
public Table<Employee> Employees => GetTable<Employee>();
}
之後即可簡潔呼叫:
using (var db = new NorthwindDataContext()) { ... }