2016-12-13 100 views
-2

我正在學校系統上工作,並且系統中有許多用戶(教師和管理員)。實體框架花費太多時間添加「WHERE子句」

(工具)

  1. Asp.net 5(MVC使用C#)VS 2015年

  2. SQL SERVER(天青)

  3. 代碼優先方法

每個用戶分配到一個或多個類。

在對方

(用戶應該只看到班級裏他的類和生)

捕捉到每一個用戶類別

我已經寫這個方法

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

  • 學校

所以我不知道什麼是我在這裏做了它的問題,你能不能請告知我這個

感謝和問候。

+0

假設您有Server Management Studio可用,我建議您在進行這些查詢時運行SQL Profiler。應該很明顯,爲什麼你的查詢太慢了。 –

+1

使用'AsEnumerable()'將從數據庫加載整個表。我假設'GetClasses()'也會從db –

+0

@TiesonT加載完整的數據。我運行了Profiler,我顯示執行了一輪1000條語句。 – Loai

回答

0

正在放慢你失望的第一件事情是AsEnumerable()

here的使用AsEnumerable()

基本上你越來越內存中的所有學生,然後運行你的where子句中的應用程序的內存,而不是剛開的影響選定的學生。

編輯1:

o.Name.ToLower().Contains(search) 

我不認爲你需要做的ToLower()爲MSSQL的情況下,在默認情況下不區分大小寫。這應該不需要用db.Students.AsEnumerable()

編輯2:

你爲什麼不使用連接?這將是一個很好的優化開始。

List<Student> data = (from student in db.Students 
join clss in db.Classes on student.Class equals clss 
where student.Name.Contains(search)).ToList() 
+0

我嘗試重新IEnumrable()它給了我這個錯誤 'LINQ to Entities does not recognized the method'System.Collections.Generic.IEnumerable'1 GetClasses( )'方法,並且此方法無法轉換爲商店表達式' – Loai

+0

是的。這是正確的。 GetClasses()方法做什麼? –

+0

它檢索用戶類,我已經包含在線程順便說一句。 – Loai

0

這解決我的問題,而且它只有大約3到4秒發生。

int[] Classes = UserDB.GetClasses().Select(c => c.Id).ToArray(); 

    var items = db.Students.Where(o => o.Name.ToLower().Contains(search)) 
     .Where(r => Classes.Contains(r.ClassID.Value)).AsQueryable();