Commit Graph

3 Commits

Author SHA1 Message Date
eff3ad778b 優化 adminUserController.cs 的子查詢性能
問題:
Line 93 將所有會員的 admin_num 載入內存(ToList)
- 如果有 10,000 個會員,載入 10,000 個 int (40KB)

優化:
改為使用 IQueryable 子查詢,在數據庫層面執行
- var usedAdminNums = _db.members.Select(b => b.admin_num);  // 不 ToList()
- 生成 SQL: WHERE num NOT IN (SELECT admin_num FROM members)

效果:
✓ 減少內存占用:40KB → 0
✓ 減少查詢次數:2 次 → 1 次
✓ SQL 優化器可以更好地優化查詢計劃

對比原始代碼:
- 原始(嵌套 AsEnumerable):N+1 查詢問題,執行 51 次
- ToList 版本:載入 40KB,執行 2 次
- 當前版本:不載入內存,執行 1 次(最佳)
2025-11-12 17:27:35 +08:00
4e26dd648d 完成 Batch 3:修復 4 個 API Controller 的 AsEnumerable 問題
修復文件(共 17 處):

1. supplierController.cs (6 處)
   - 移除簡單查詢的 AsEnumerable() (2 處)
   - AsEnumerable() → AsQueryable() (GetList, GetKindList)
   - 優化分頁查詢模式(Count + ToPagedList.ToList())(2 處)
   - 修復 Split().Select().ToList() 類型問題

2. adminUserController.cs (4 處)
   - 移除簡單查詢的 AsEnumerable()
   - AsEnumerable() → AsQueryable() (GetList)
   - 優化分頁查詢模式
   - 重構複雜查詢:移除嵌套的 AsEnumerable()
     改為先 ToList() 再使用 Contains

3. orderdetailController.cs (3 處)
   - 移除 AsEnumerable(),改為在查詢末端使用 OrderBy
   - 優化分頁查詢模式
   - 修復 null-propagating operator:
     .FirstOrDefault()?.print_id → .Select(u => u.print_id).FirstOrDefault()

4. transfer_registerController.cs (6 處)
   - AsEnumerable() → ToList() (需要解密操作的情況)
   - 保留在必要時才轉換到內存操作
   - 確保數據庫查詢先執行

技術改進:
✓ 複雜嵌套查詢優化(adminUserController)
✓ 解密操作前置優化(transfer_registerController)
✓ Null-propagating operator 替換為安全的 Select
✓ 統一使用三元運算符處理分頁
✓ IEnumerable<int> → List<int> 避免類型轉換錯誤
2025-11-12 17:18:12 +08:00
af2c152ef6 migrate to new git 2025-08-29 01:27:25 +08:00