我正在學校系統上工作,並且系統中有許多用戶(教師和管理員)。實體框架花費太多時間添加「WHERE子句」
(工具)
Asp.net 5(MVC使用C#)VS 2015年
SQL SERVER(天青)
代碼優先方法
每個用戶分配到一個或多個類。
在對方
(用戶應該只看到班級裏他的類和生)
捕捉到每一個用戶類別
我已經寫這個方法
public static IEnumerable<Class> GetClasses()
{
string UserId = HttpContext.Current.User.Identity.GetUserId();
ApplicationDbContext db = new ApplicationDbContext();
var Job = db.Jobs.Where(j => j.UserId == UserId).FirstOrDefault();
if (Job.EntityLevelID == 1)
{
var x = db.Classes.Where(a => a.Levels.SupervisionCenter.Organization.Id == Job.EntityID) as IEnumerable<Class>;
return x;
}
return null;
}
在學生列表控制器我只想讓用戶得到他的學生,只有在他的Cla的SSE
把所有我寫這樣的代碼
var items = db.Students.AsEnumerable().Where(o => o.Name.ToLower().Contains(search)).AsQueryable();
此代碼將提供所有的學生,需要10左右秒加載並完成所有的數據(學生,而且這不需要BCS ,我需要過濾ClassID字段)。
,當我需要的用戶權限篩選基於類
我已經編輯的代碼是
var items = db.Students.AsEnumerable().Where(o => o.Name.ToLower().Contains(search))
.Where(s => UserDB.GetClasses().Select(c => c.Id).Contains(s.ClassID.Value))
.AsQueryable();
前面的情況,當我加入那裏查詢它需要比更多80秒
EDIT(1) 組織結構圖將
組織
SuperVisionCenter
學校
類
所以我不知道什麼是我在這裏做了它的問題,你能不能請告知我這個
感謝和問候。
假設您有Server Management Studio可用,我建議您在進行這些查詢時運行SQL Profiler。應該很明顯,爲什麼你的查詢太慢了。 –
使用'AsEnumerable()'將從數據庫加載整個表。我假設'GetClasses()'也會從db –
@TiesonT加載完整的數據。我運行了Profiler,我顯示執行了一輪1000條語句。 – Loai