|
|
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 |
|