基于来自两个不同模型的数据返回视图

时间:2014-09-18 16:04:20

标签: c# asp.net-mvc

这可能是一件非常容易的事,但我找不到办法。

我正在尝试返回DepartmentID为1且DirectorID为2的视图。 DepartmentID位于Employee类中,DirectorID位于Director类中。

 public class Employee
{
    public int EmployeeID { get; set; }
    public string Name { get; set; }
 }
  public class Director
{
    public int DirectorID { get; set; }
    public string Name { get; set; }
 }

这是我的ActionResult,但这不符合我的要求。我需要在我的where声明中包含DirectorID。我应该使用&&?

   public ActionResult Index()
    {
     return View(db.Employee.Where(x => x.DepartmentID == 1)); 
    }

1 个答案:

答案 0 :(得分:1)

有很多方法可以解决这个问题,但这些方法是否合适取决于这些实体之间的关系或缺乏关系,而这些实体尚未披露。

首先,让我们来看一个实际关系的基本例子。假设你有类似的东西:

public class Employee
{
    public int EmployeeID { get; set; }
    public string Name { get; set; }

    public int DirectorId { get; set; }
    public virtual Director Director { get; set; }
}

换句话说,在EmployeeDirector之间存在一对多,其中员工有一名董事,一名董事有很多员工,然后在您的行动中,您可以执行以下操作:

db.Employees.Where(x => x.DepartmentID == 1 && x.DirectorId == 2).Include("Director");

这将为您提供一份员工列表,每个员工都可以通过Director上的Director媒体访问Employee个实例。然后,您可以在视图中随意使用每个Employee实例的Director实例或Employee实例。

如果不是直接关系,则需要单独查询每个关系并将它们组合在视图模型中。例如:

public class EmployeesDirectorViewModel
{
    public List<Employee> Employees { get; set; }

    public Director Director { get; set; }
}

然后在你的行动中:

var employees = db.Employee.Where(x => x.DepartmentID == 1);
var director = db.Directors.Where(x => x.DirectorID == 2);

var model = new EmployeesDirectorViewModel
{
    Employees = employees,
    Director = director
}

return View(model);

但是,应该注意的是,由于我们假设此示例中没有直接关系,因此无法过滤员工所属的员工。

第三个选项是前一个选项的组合。即使您与员工和董事之间存在直接关系,您仍然可以使用视图模型来更好地组织数据。视图模型的目标是针对视图需要优化数据,因此您可以包含属性的子集,不包含实体的附加属性,计算和聚合等。

最后,可能存在关系,而不是直接关系。例如,您可能有类似的内容:

public class Employee
{
    ...

    public int DepartmentID { get; set; }
    public virtual Department Department { get; set; }
}

public class Department
{
    ...

    public int DirectorID { get; set; }
    public Director Director { get; set; }
}

您可以通过与我的第一个示例非常相似的方式处理此问题,您只需要在查询中遍历关系:

db.Employees.Where(x => x.DepartmentID == 1 && x.Department.DirectorId == 2)
    .Include("Department.Director");

现在,这个例子是设计的,因为如果你按照id选择部门,那么在特定的导演中进一步调整它是没有意义的。导演要么是导演,要么不是。