Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何使此ViewModel正确?_Asp.net Mvc_Entity Framework_Linq To Entities_Asp.net Mvc Viewmodel - Fatal编程技术网

Asp.net mvc 如何使此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,但没有正确填

利用MVC 5和实体框架,我试图为我的索引视图建立一个视图模型,展示员工及其目标。 我有一个employee表、一个employeeMap表(带有效负载的联接表)和一个目标表。 员工和EmployeeMap之间以及目标和EmployeeMap之间存在一对多关系。 我是一个完全的新手,一直在使用索引视图,它最初应该显示员工,当选择一个员工时,应该显示员工的目标

我无法正确执行索引操作:

var viewModel=新员工目标()

我确实正确填充了viewmodel.employees,但没有正确填充viewmodel.goals

哦,viewmodel是:

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