基于来自两个不同模型的数据返回视图
本文关键字:模型 数据 视图 返回 两个 | 更新日期: 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; }
}
换句话说,在Employee
和Director
之间存在一对多,其中一名员工有一名董事,一名董事有许多员工,那么在您的操作中,您可以执行以下操作:
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来选择部门的,那么也没有必要用特定的主管来进一步限制它。导演要么是导演,要么不是。