Linq to SQL 為微軟首款原生 ORM,僅支援 SQL Server,但開發體驗遠優於 NHibernate。透過 .dbml 設計師拖曳資料表自動生成實體類別與 DataContext 子類別,極大簡化映射工作。
.dbml.designer.cs (含 UserInfoDataClassesDataContext)

public class LinqCRUD
{
public int Count()
{
// 方式二:強型別 DataContext (推薦)
var ctx = new UserInfoDataClassesDataContext();
return ctx.UserInfo.Count();
}
public void Create(UserInfo info)
{
var ctx = new UserInfoDataClassesDataContext();
ctx.UserInfo.InsertOnSubmit(info);
ctx.SubmitChanges();
}
public UserInfo Read(int userId)
{
var ctx = new UserInfoDataClassesDataContext();
ctx.Log = Console.Out; // 輸出 SQL
return ctx.UserInfo.First(u => u.UserID == userId);
}
public void Update(UserInfo info)
{
var ctx = new UserInfoDataClassesDataContext();
var ui = ctx.UserInfo.First(u => u.UserID == info.UserID);
ui.Age = info.Age; ui.Email = info.Email; ui.Mobile = info.Mobile;
ui.Phone = info.Phone; ui.RealName = info.RealName; ui.Sex = info.Sex;
ui.UserName = info.UserName;
ctx.SubmitChanges();
}
public void Delete(int userId)
{
var ctx = new UserInfoDataClassesDataContext();
var ui = ctx.UserInfo.First(u => u.UserID == userId);
ctx.UserInfo.DeleteOnSubmit(ui);
ctx.SubmitChanges();
}
public void Delete(UserInfo info)
{
var ctx = new UserInfoDataClassesDataContext();
var list = from u in ctx.UserInfo where u.UserID == info.UserID select u;
foreach (var u in list) ctx.UserInfo.DeleteOnSubmit(u);
ctx.SubmitChanges();
}
public int GetMaxUserId()
{
var ctx = new UserInfoDataClassesDataContext();
return ctx.UserInfo.Max(u => u.UserID);
}
}
UserInfoDataClassesDataContext 繼承 DataContext,為 .dbml 自動生成的強型別上下文InsertOnSubmit/DeleteOnSubmit 標記變更,SubmitChanges 一次性提交ctx.Log 可即時觀察生成 SQL,極利除錯DeleteOnSubmit(info) 會失效 (游離物件)測試案例同前,全數通過。Linq to SQL 開發效率顯著優於 NHibernate,但受限於單一資料庫支援,實務常轉向 Entity Framework。