参数化控制器操作中的数据库列名称

时间:2011-07-01 02:04:43

标签: c# asp.net-mvc entity-framework

我想要一个控制器动作“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那么控制器将显示医学院的教授等等其他学校类型。

我怎样才能避免在这里写字?提前谢谢。

2 个答案:

答案 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);
}