我想要一个控制器动作“ProfessorStatus”查询“教授”表并返回特定学校的活跃教授名单。
这是我的控制器动作,我正在努力参与“学校”栏目
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 :(得分: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)
答案 1 :(得分: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);
}