完成 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> 避免類型轉換錯誤
This commit is contained in:
2025-11-12 17:18:12 +08:00
parent e20b250944
commit 4e26dd648d
4 changed files with 35 additions and 31 deletions

View File

@@ -50,7 +50,7 @@ public class supplierController : BaseApiController
// DELETE api/<controller>/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
};