From 4e26dd648d2bb1a5e4756f0f9fd46e63a1cd2d94 Mon Sep 17 00:00:00 2001 From: yiming Date: Wed, 12 Nov 2025 17:18:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=20Batch=203=EF=BC=9A?= =?UTF-8?q?=E4=BF=AE=E5=BE=A9=204=20=E5=80=8B=20API=20Controller=20?= =?UTF-8?q?=E7=9A=84=20AsEnumerable=20=E5=95=8F=E9=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修復文件(共 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 → List 避免類型轉換錯誤 --- web/App_Code/api/adminUserController.cs | 20 ++++++++-------- web/App_Code/api/orderdetailController.cs | 10 ++++---- web/App_Code/api/supplierController.cs | 24 +++++++++++-------- .../api/transfer_registerController.cs | 12 +++++----- 4 files changed, 35 insertions(+), 31 deletions(-) diff --git a/web/App_Code/api/adminUserController.cs b/web/App_Code/api/adminUserController.cs index cf04653..1a56b61 100644 --- a/web/App_Code/api/adminUserController.cs +++ b/web/App_Code/api/adminUserController.cs @@ -52,7 +52,7 @@ public class adminUserController : ApiController // DELETE api//5 public void Delete(int id) { - var prod = _db.admins.AsEnumerable().Where(q => q.num == id).FirstOrDefault(); //刪除該筆資料 + var prod = _db.admins.Where(q => q.num == id).FirstOrDefault(); //刪除該筆資料 if (prod != null) { @@ -76,7 +76,7 @@ public class adminUserController : ApiController public IHttpActionResult GetList([FromBody] Model.ViewModel.admin q, int page, int pageSize = 10, string sortBy = "", bool sortDesc = false) { - var qry = _db.admins.AsEnumerable(); + var qry = _db.admins.AsQueryable(); if (!string.IsNullOrEmpty(q.u_id)) qry = qry.Where(o => o.u_id.Contains(q.u_id)); @@ -90,17 +90,14 @@ public class adminUserController : ApiController if(q.removeExist.HasValue && q.removeExist.Value) { + var existingAdminNums = _db.members.Select(b => b.admin_num).ToList(); if (q.num.HasValue && q.num.Value > 0) { - qry = qry.Where(o => (!(from b in _db.members.AsEnumerable() - select b.admin_num) - .Contains(o.num)) || o.num == Convert.ToInt32(q.num.Value)); + qry = qry.Where(o => !existingAdminNums.Contains(o.num) || o.num == q.num.Value); } else { - qry = qry.Where(o => (!(from b in _db.members.AsEnumerable() - select b.admin_num) - .Contains(o.num))); + qry = qry.Where(o => !existingAdminNums.Contains(o.num)); } } @@ -114,9 +111,12 @@ public class adminUserController : ApiController else qry = qry.OrderByDescending(o => o.num); + var count = qry.Count(); + var qryList = (pageSize > 0) ? qry.ToPagedList(page, pageSize).ToList() : qry.ToList(); + var ret = new { - list = qry.ToPagedList(page, pageSize).Select(x => new + list = qryList.Select(x => new { num = x.num, u_id = x.u_id, @@ -124,7 +124,7 @@ public class adminUserController : ApiController power = x.power, }), - count = qry.Count() + count = count }; diff --git a/web/App_Code/api/orderdetailController.cs b/web/App_Code/api/orderdetailController.cs index 8d265c5..b01f38b 100644 --- a/web/App_Code/api/orderdetailController.cs +++ b/web/App_Code/api/orderdetailController.cs @@ -27,14 +27,14 @@ public class orderdetailController:ApiController //var OrderList = _db.pro_order.Where(u => u.activity_num == activity_num).Select(j => j.order_no).ToList(); //var gdzOrderList = _db.pro_order_detail.Where(o => OrderList.Contains(o.order_no) && o.print_id.Contains("主")).Select(o => o.order_no).Distinct().ToList(); //var qry = _db.pro_order.Where(u => gdzOrderList.Contains(u.order_no)).AsEnumerable(); - var qry = _db.pro_order.Where( u => u.activity_num == activity_num).AsEnumerable(); - - qry = qry.OrderByDescending(o => o.reg_time); + var qry = _db.pro_order.Where( u => u.activity_num == activity_num).OrderByDescending(o => o.reg_time); var count = qry.Count(); //pageSize = count;//一次取回?? + var qryList = (pageSize > 0) ? qry.ToPagedList(page, pageSize).ToList() : qry.ToList(); + var ret = new { - list = qry.ToPagedList(page, pageSize).Select(x => new + list = qryList.Select(x => new { order_no = x.order_no, f_num = x.f_num, @@ -50,7 +50,7 @@ public class orderdetailController:ApiController || u.actItem.subject.Contains("牌") || !string.IsNullOrEmpty(u.f_num_tablet)) .Count(), - actItem = x.pro_order_detail.Where(u => u.printed_files != null).FirstOrDefault()?.print_id } + actItem = x.pro_order_detail.Where(u => u.printed_files != null).Select(u => u.print_id).FirstOrDefault() } }), count = count }; diff --git a/web/App_Code/api/supplierController.cs b/web/App_Code/api/supplierController.cs index ce9d34f..90e7212 100644 --- a/web/App_Code/api/supplierController.cs +++ b/web/App_Code/api/supplierController.cs @@ -50,7 +50,7 @@ public class supplierController : BaseApiController // DELETE api//5 public void Delete(int id) { - var prod = _db.suppliers.AsEnumerable().Where(q => q.num == id).FirstOrDefault(); //刪除該筆資料 + var prod = _db.suppliers.Where(q => q.num == id).FirstOrDefault(); //刪除該筆資料 if (prod != null) { if (!string.IsNullOrEmpty(prod.pic1)) @@ -80,8 +80,8 @@ public class supplierController : BaseApiController { if (!string.IsNullOrEmpty(nums)) { - var ids = nums.TrimEnd(',').Split(',').Select(s => int.Parse(s)); - var prod = _db.suppliers.AsEnumerable().Where(q => ids.Contains(q.num)).ToList(); + var ids = nums.TrimEnd(',').Split(',').Select(s => int.Parse(s)).ToList(); + var prod = _db.suppliers.Where(q => ids.Contains(q.num)).ToList(); if (prod.Count() > 0) { publicFun publicFun = new publicFun(); @@ -113,7 +113,7 @@ public class supplierController : BaseApiController public IHttpActionResult GetList([FromBody] Model.ViewModel.supplier q, int page, int pageSize = 10, string sortBy = "", bool sortDesc = false) { - var qry = _db.suppliers.AsEnumerable(); + var qry = _db.suppliers.AsQueryable(); if (!string.IsNullOrEmpty(q.u_name)) qry = qry.Where(o => o.u_name.Contains(q.u_name.Trim())); @@ -159,9 +159,12 @@ public class supplierController : BaseApiController else qry = qry.OrderByDescending(o => o.num); + var count = qry.Count(); + var qryList = (pageSize > 0) ? qry.ToPagedList(page, pageSize).ToList() : qry.ToList(); + var ret = new { - list = qry.ToPagedList(page, pageSize).Select(x => new + list = qryList.Select(x => new { num = x.num, u_name = x.u_name, @@ -176,7 +179,7 @@ public class supplierController : BaseApiController }).ToList(), x.kind) : "", }), - count = qry.Count() + count = count }; @@ -192,7 +195,7 @@ public class supplierController : BaseApiController { - var qry = _db.supplier_kind.AsEnumerable(); + var qry = _db.supplier_kind.AsQueryable(); if (!string.IsNullOrEmpty(q.kind)) qry = qry.Where(o => o.kind.Contains(q.kind)); @@ -205,17 +208,18 @@ public class supplierController : BaseApiController range = o.range, }).OrderBy(x => x.root).ThenBy(x => x.kind).ToList(), 0, 0); - + var count = qry.Count(); + var qry2List = (pageSize > 0) ? qry2.ToPagedList(page, pageSize).ToList() : qry2.ToList(); var ret = new { - list = qry2.ToPagedList(page, pageSize).Select(x => new + list = qry2List.Select(x => new { num = x.num, kind = new TreeView().RptDash(x.Level) + x.kind, }), - count = qry.Count() + count = count }; diff --git a/web/App_Code/api/transfer_registerController.cs b/web/App_Code/api/transfer_registerController.cs index f7af55b..bb4deab 100644 --- a/web/App_Code/api/transfer_registerController.cs +++ b/web/App_Code/api/transfer_registerController.cs @@ -237,7 +237,7 @@ public class transfer_registerController : ApiController x.draft, follower = x.f_num != null ? _db.followers .Where(f => f.num == x.f_num) - .AsEnumerable() + .ToList() .Select(f => new { f.num, f.u_name, @@ -417,7 +417,7 @@ public class transfer_registerController : ApiController d.demo, reg_time = o.reg_time // 報名日期 })) - .AsEnumerable() + .ToList() .Select(x => new { x.order_no, x.activity_num, @@ -481,7 +481,7 @@ public class transfer_registerController : ApiController x.draft, follower = x.f_num != null ? _db.followers .Where(f => f.num == x.f_num) - .AsEnumerable() + .ToList() .Select(f => new { f.num, f.u_name, @@ -817,7 +817,7 @@ public class transfer_registerController : ApiController tr.balance_act_item, balance_actitem_name = tr.balance_act_item != null ? _db.actItems.Where(a => a.num == tr.balance_act_item).Select(a => a.subject).FirstOrDefault() : "" }) - .AsEnumerable() + .ToList() .Select(tr => new { tr.id, @@ -1054,7 +1054,7 @@ public class transfer_registerController : ApiController d.price, paid = d.pro_order_record.Select(r => r.price).DefaultIfEmpty(0).Sum() })) - .AsEnumerable() + .ToList() .Select(x => new { x.f_num, x.follower_name, @@ -1104,7 +1104,7 @@ public class transfer_registerController : ApiController d.demo, reg_time = o.reg_time // 報名日期 })) - .AsEnumerable() + .ToList() .Select(x => new { x.order_no, x.activity_num,