資料表 `Students`:`StudentID` (PK), `Name`, `Password`。已知學號查詢姓名,顯示在 `Label` 控件。
// 頁面類
public partial class QueryStudent : System.Web.UI.Page {
protected void btnQuery_Click(object sender, EventArgs e) {
string inputId = txtStudentID.Text.Trim();
if (string.IsNullOrEmpty(inputId)) {
lblMessage.Text = "請輸入學號";
return;
}
using (var db = new SchoolDataContext()) { // dbml 生成的 DataContext
// 方案 1: FirstOrDefault (推薦,無結果返回 null 不拋異常)
var student = db.Students.FirstOrDefault(s => s.StudentID == inputId);
if (student != null) {
lblName.Text = student.Name; // 直接賦值
lblMessage.Text = "查詢成功";
} else {
lblName.Text = "";
lblMessage.Text = "未找到該學號";
}
}
}
}
| 方法 | 行為 | 適用場景 |
|---|---|---|
| `FirstOrDefault(predicate)` | 返回第一個匹配元素或 `null` (引用類型) / `default(T)` | **預期 0 或 1 條** (PK/唯一索引查詢) |
| `SingleOrDefault(predicate)` | 返回唯一匹配元素,**多於 1 條拋異常** | 業務要求嚴格唯一性驗證 |
| `Where(predicate).Select(s => s.Name).FirstOrDefault()` | 僅投影所需字段,生成 `SELECT Name ...` SQL | 大表優化,減少網絡傳輸 |
// DbContext 注入 (ASP.NET Core DI)
public class QueryModel : PageModel {
private readonly SchoolContext _db;
public QueryModel(SchoolContext db) => _db = db;
[BindProperty] public string InputId { get; set; }
public string StudentName { get; set; }
public string Message { get; set; }
public void OnPost() {
StudentName = _db.Students
.Where(s => s.StudentID == InputId)
.Select(s => s.Name)
.FirstOrDefault() ?? "";
Message = string.IsNullOrEmpty(StudentName) ? "未找到" : "成功";
}
}
```razor
@Model.Message
```