Asp.net mvc 如何使此ViewModel正确?
利用MVC 5和实体框架,我试图为我的索引视图建立一个视图模型,展示员工及其目标。 我有一个employee表、一个employeeMap表(带有效负载的联接表)和一个目标表。 员工和EmployeeMap之间以及目标和EmployeeMap之间存在一对多关系。 我是一个完全的新手,一直在使用索引视图,它最初应该显示员工,当选择一个员工时,应该显示员工的目标 我无法正确执行索引操作: var viewModel=新员工目标() 我确实正确填充了viewmodel.employees,但没有正确填充viewmodel.goals 哦,viewmodel是:Asp.net mvc 如何使此ViewModel正确?,asp.net-mvc,entity-framework,linq-to-entities,asp.net-mvc-viewmodel,Asp.net Mvc,Entity Framework,Linq To Entities,Asp.net Mvc Viewmodel,利用MVC 5和实体框架,我试图为我的索引视图建立一个视图模型,展示员工及其目标。 我有一个employee表、一个employeeMap表(带有效负载的联接表)和一个目标表。 员工和EmployeeMap之间以及目标和EmployeeMap之间存在一对多关系。 我是一个完全的新手,一直在使用索引视图,它最初应该显示员工,当选择一个员工时,应该显示员工的目标 我无法正确执行索引操作: var viewModel=新员工目标() 我确实正确填充了viewmodel.employees,但没有正确填
public class EmployeeGoals
{
public IEnumerable<EmployeeMap> EmployeeMaps { get; set; }
public IEnumerable<Employee> Employees { get; set; }
public IEnumerable<Goal> Goals { get; set; }
}
无法确定如何使用导航属性获得结果,因此最终使用上述解决方案。它确实起作用,但我是否经常访问数据库??另外,最后混合使用了LINQ语法-我知道,应该只使用其中一种:-/您应该使用
SelectMany
:
viewModel.Goals = viewModel.EmployeeMaps
.Where(e => e.EmployeeID == ViewBag.EmployeeID)
.SelectMany(e => e.Goals);
因为
EmployeeMaps.Where()
是一个IEnumerable
,所以Select
产生IEnumerable
SelectMany
将其展平为IEnumerable
您的viewModel。目标
是viewModel.EmployeeMaps
的子集。但是viewModel.EmployeeMaps
设置在哪里?您的代码似乎没有任何明显的问题。最有可能的是,涉及EmployeeMaps
的LINQ语句没有返回任何内容。我会把它分成几行,然后在上面运行调试器,这样你就可以检查从Where
调用返回的值,看看是否有任何相关的目标。@Raymen-正确,我在示例中忽略了这一点,我已经编辑了它,现在剩下的是我认为真正的问题。如何填充viewmodel.goals-代码不起作用:-/
viewModel.Employees = db.Employees
.Include(d => d.Department)
.Include(e => e.Position)
.Include(m => m.EmployeeMaps)
.Where(d => d.OrganizationID == oid && d.Department.ManagerID == currentUser.EmployeeID)
.OrderBy(d => d.HireDate);
if (id != null)
{
ViewBag.EmployeeID = id.Value;
viewModel.EmployeeMaps = viewModel.Employees.Where(e => e.ID == id.Value).Single().EmployeeMaps;
viewModel.Goals = from g in db.Goals
join m in db.EmployeeMaps on g.ID equals m.GoalID
join e in db.Employees on m.EmployeeID equals e.ID
where m.EmployeeID == id.Value
select g;
}
viewModel.Goals = viewModel.EmployeeMaps
.Where(e => e.EmployeeID == ViewBag.EmployeeID)
.SelectMany(e => e.Goals);