2011-07-01 31 views
0

我想要一個控制器動作「ProfessorStatus」,它查詢「Professor」表並返回特定學校的活動教授列表。參數化控制器動作中的數據庫列名

這裏是控制器動作我有,我與參數化「學校」欄目

public ActionResult ProfessorStatus(string schoolType) 
    { 

     var activeProfessors = (from p in prof.ProfessorTable.Where(a => a.Engineering.Value == true) 
           group p by p.ProfessorID into g 
           select g.Key).ToList(); 

     return View(activeProfessors); 
    } 

現在,在上面的控制器動作掙扎。我不想使用「工程」硬編碼,而是使用「schoolType」對其進行參數化。

所以,如果我通過schoolType = Medicine然後控制器會顯示其他學校類型的醫學院等教授。

我該如何避免在這裏困難?提前致謝。

+0

爲什麼視圖只能得到ID? – SLaks

回答

1

如果你不是在一個位置,重新設計你的整個數據庫和系統使用它,你仍然可以通過使用表達式來解決這個問題。

public ActionResult ProfessorStatus(string schoolType) { 
    Expresison<Func<Professor, bool>> filter; 
    switch (schoolType) { 
    case "Engineering": 
     filter= a => a.Engineering.Value == true; 
     break; 
    default: 
     throw new Exception("Unknown SchoolType - " + schoolType); 
    } 
    var activeProfessors = (from p in prof.ProfessorTable.Where(filter) 
    group p by p.ProfessorID into g 
    select g.Key).ToList(); 
    return View(activeProfessors); 
} 
+0

是的,我沒有時間去改變表格結構。必須使用我現在的工作。我很難理解你的方式。當我使用Expression時,出現錯誤:無法找到類型或名稱空間名稱'Expression'(您是否缺少using指令或程序集引用?) – user793468

+0

using System.Linq.Expressions;將鼠標懸停在未識別的類型上,並使用藍色或紅色的小彈出窗口可以自動查找使用語句。 –

+0

明白了。謝謝! 那麼我會擁有和我擁有的許多學校一樣多的案例嗎?像這樣? Expresison > filter; switch(schoolType){ case「Engineering」: filter = a => a.Engineering.Value == true; 休息; case「Medicine」: filter = a => a.Medicine.Value == true; 休息; 默認值: 拋出新的異常(「Unknown SchoolType - 」+ schoolType); } – user793468

2

您的數據庫設計不佳。

而不是每個學校都有一個布爾列,你應該有一個單獨的表格映射教授到學校,列出教授ID和學校名稱或ID。

然後,您可以編寫

prof.ProfessorTable.Where(p => p.Schools.Any(ps => ps.School = schoolType)) 

如果你真的只需要教授ID,你也可以寫

prof.ProfessorSchools.Where(ps => ps.School = schoolType) 
        .Select(ps => ps.ProfessorId)