問題: 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 次(最佳)
140 lines
3.7 KiB
C#
140 lines
3.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Net;
|
|
using System.Net.Http;
|
|
using System.Web.Http;
|
|
using PagedList;
|
|
using Newtonsoft.Json;
|
|
using System.Collections;
|
|
|
|
|
|
// api/adminUser
|
|
//[ezAuthorize(Roles = "admin")]//群組:*
|
|
[ezAuthorize]
|
|
public class adminUserController : ApiController
|
|
{
|
|
private Model.ezEntities _db = new Model.ezEntities();
|
|
// GET api/<controller>
|
|
public IEnumerable<Model.admin> Get()
|
|
{
|
|
var list = _db.admins.ToList();
|
|
if (list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
|
|
return list;
|
|
}
|
|
|
|
public IEnumerable<Model.admin> Get(int page, int pageSize = 10,
|
|
string sortBy="", bool sortDesc=false)
|
|
{
|
|
var list = _db.admins.OrderBy(o=>o.num).ToPagedList(page, pageSize);
|
|
if (list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
|
|
return list;
|
|
}
|
|
|
|
// GET api/<controller>/5
|
|
public Model.admin Get(int id)
|
|
{
|
|
var item = _db.admins.Where(q => q.num == id).FirstOrDefault();
|
|
//if (item == null) throw new HttpResponseException(HttpStatusCode.NotFound);
|
|
return item;
|
|
}
|
|
|
|
// POST api/<controller>
|
|
public void Post([FromBody] Model.admin item)
|
|
{
|
|
}
|
|
|
|
// PUT api/<controller>/5
|
|
public void Put(int id, [FromBody] Model.admin item)
|
|
{
|
|
}
|
|
|
|
// DELETE api/<controller>/5
|
|
public void Delete(int id)
|
|
{
|
|
var prod = _db.admins.Where(q => q.num == id).FirstOrDefault(); //刪除該筆資料
|
|
if (prod != null)
|
|
{
|
|
|
|
_db.admins.Remove(prod);
|
|
_db.SaveChanges();//執行
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
[HttpGet]
|
|
[Route("api/adminUser/count")]
|
|
public int Count()
|
|
{
|
|
var count = _db.admins.Count();
|
|
return count;
|
|
}
|
|
[HttpPost]
|
|
[Route("api/adminUser/GetList")]
|
|
public IHttpActionResult GetList([FromBody] Model.ViewModel.admin q, int page, int pageSize = 10,
|
|
string sortBy = "", bool sortDesc = false)
|
|
{
|
|
var qry = _db.admins.AsQueryable();
|
|
|
|
if (!string.IsNullOrEmpty(q.u_id))
|
|
qry = qry.Where(o => o.u_id.Contains(q.u_id));
|
|
|
|
if (!string.IsNullOrEmpty(q.u_name))
|
|
qry = qry.Where(o => o.u_name.Contains(q.u_name));
|
|
|
|
|
|
if (!string.IsNullOrEmpty(q.power))
|
|
qry = qry.Where(o => o.power == q.power);
|
|
|
|
if(q.removeExist.HasValue && q.removeExist.Value)
|
|
{
|
|
// 優化:使用子查詢在數據庫層面執行,避免載入所有會員的 admin_num
|
|
var usedAdminNums = _db.members.Select(b => b.admin_num);
|
|
if (q.num.HasValue && q.num.Value > 0)
|
|
{
|
|
qry = qry.Where(o => !usedAdminNums.Contains(o.num) || o.num == q.num.Value);
|
|
}
|
|
else
|
|
{
|
|
qry = qry.Where(o => !usedAdminNums.Contains(o.num));
|
|
}
|
|
}
|
|
|
|
if (sortBy.Equals("u_id"))
|
|
{
|
|
if (sortDesc)
|
|
qry = qry.OrderByDescending(o => o.u_id);
|
|
else
|
|
qry = qry.OrderBy(o => o.u_id);
|
|
}
|
|
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 = qryList.Select(x => new
|
|
{
|
|
num = x.num,
|
|
u_id = x.u_id,
|
|
u_name = x.u_name,
|
|
power = x.power,
|
|
|
|
}),
|
|
count = count
|
|
|
|
};
|
|
|
|
|
|
if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
|
|
return Ok(ret);
|
|
}
|
|
|
|
|
|
|
|
}
|