ASP.NET 註冊頁面使用 CustomValidator 驗證用戶名是否已存在。原代碼將所有分類名稱查出來逐條比對,存在兩個嚴重缺陷:
args.IsValid 在循環內反覆賦值,最後一條記錄決定結果,邏輯錯誤。直接在數據庫層面過濾,僅返回匹配記錄:
var name0 = args.Value;
var c = from r in db.Category
where r.Name == name0
select r.Name;
args.IsValid = !c.Any();
Any() 會生成 EXISTS SQL,極其高效。
若必須遍歷,應先假設有效,發現重複才標記無效並跳出:
args.IsValid = true;
foreach (var m in c) {
if (args.Value.Equals(m.ToString())) {
args.IsValid = false;
break;
}
}
永遠優先使用數據庫原生過濾(Where、Any、Count),避免將大量數據拉取到應用層處理;驗證邏輯要「一次判定,早退出」。