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

本文关键字:模型 数据 视图 返回 两个 | 更新日期: 2023-09-27 18:22:19

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

我试图返回一个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)); 
    }

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

有很多方法可以处理这一问题,但哪种方法合适取决于这些实体之间的关系或缺乏关系,您尚未披露。

首先,让我们举一个有实际关系的基本例子。假设你有这样的东西:

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");

它将为您提供一个员工列表,每个员工都有一个可通过Employee上的Director属性访问的Director实例。然后,您可以在视图中随意处理每个Employee实例的Employee实例或Director实例。

如果没有直接关系,则需要分别查询每个关系,并将它们组合到视图模型中。例如:

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来选择部门的,那么也没有必要用特定的主管来进一步限制它。导演要么是导演,要么不是。