2013-01-23 73 views
2

我正在处理一个应用程序,它将返回一个Excel报告,每个员工具有多个角色以及每个角色的预期和实际工时。例如,我可能被列为一名开发人员,另一列则是一名学士学位!它正在使用的查询返回一个空的结果集。MVC 3实体框架空结果集

public ActionResult ExpectedVsActual() 
    { 

     try 
     { 
      ProjectTotalsReportViewModel model = new ProjectTotalsReportViewModel(); 

      Employee currentUser = DataHelper.GetEmployee(User, db); 

      model.AvailableEmployees = db.Employees.OrderBy(e => e.LastName).ThenBy(e => e.FirstName).ToList(); 

      if (currentUser.SecurityRoleCode == Constants.SECURITY_ROLE_CODE_ADMIN) 
      { 
       model.AvailableProjects = (db.Projects.Any() ? db.Projects.Where(p => p.ProjectCategoryCode == Constants.PROJECT_CATEGORY_DIRECT).OrderBy(p => p.ProjectName).Distinct().ToList() : new List<Project>()); 

       model.ProjectRate = (db.EmployeeProjectRates.Any() ? db.EmployeeProjectRates.Where(epr => epr.EmployeeID == epr.EmployeeID).OrderBy(epr => epr.EmployeeID).Distinct().ToList(): new List<EmployeeProjectRate>()); 
      } 
      else 
      { 
       model.AvailableProjects = (db.EmployeeProjectRates.Any(epr => epr.EmployeeID == currentUser.EmployeeID && epr.ProjectRoleCode == Constants.PROJECT_ROLE_PROJECT_MANAGER) ? db.EmployeeProjectRates.Where(epr => epr.EmployeeID == currentUser.EmployeeID && epr.ProjectRoleCode == Constants.PROJECT_ROLE_PROJECT_MANAGER).Select(epr => epr.Project).OrderBy(p => p.ProjectName).Distinct().ToList() : new List<Project>()); 
      } 

      model.SelectedEmployeesForCheckBox = model.AvailableEmployees; 
      model.SelectedProjectsForCheckBox = model.AvailableProjects; 

      ViewBag.InitialLoad = true; 

      return PartialView("_ExpectedVsActual", model); 
     } 
     catch 
     { 
      return null; 
     } 
    } 


[HttpPost] 
    public ActionResult ExpectedVsActual(ProjectTotalsReportViewModel Model) 
    { 
     try 
     { 
      if (ModelState.IsValid) 
      { 

       ViewBag.InitialLoad = false; 
       DataHelper.TimeFrame selectedTimeFrame = DataHelper.TimeFrame.Weekly;//Need to remove after adding selection for time frame 

       SMCContext db = new SMCContext(); 
       ViewBag.TimeFrameSelectList = DataHelper.GetTimeFrameSelectList(); 
       List<ProjectTimeFrame> timeFrames = new List<ProjectTimeFrame>(); 
       ProjectViewModel Project = new ProjectViewModel(); 
       timeFrames = DataHelper.GetProjectTimeFrames(Model.StartDate.Value, Model.EndDate.Value, selectedTimeFrame); 

       Project.EmployeeProjectRates = Project.EmployeeProjectRates.OrderBy(epr => epr.Employees.Single(e => e.Value == epr.EmployeeID.ToString())).ToList(); 



        resultFile = currentPackage.GetAsByteArray(); 
        return File(resultFile, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Expected Vs Actual.xlsx"); 

       } 
       #endregion 
      } 
      else 
      { 
       return PartialView("_ExpectedVsActual", Model); 
      } 

     } 
     catch (Exception e) 
     { 
      throw e; 

     } 







    } 

大部分格式和创建的文件我都遗漏了,它与空结果无关。结果应该是这样的 enter image description here

+0

您是否尝试过启用Sql Server Profiler并查看EF发送给您的数据库的查询? –

回答

1

它的失败对你的三个点的至少一个:

  1. 验证数据库中数据的反映,你要搜索的内容。最快捷的方法是通过某种分析器,它可以捕获EF查询在转换并显示SQL语句时的状态。 linqpad是一个很好的工具来做到这一点。

  2. 验证您的映射。你可能没有正确地映射你的关系,没有产生任何数据。

  3. 验证您自己的约束条件。它看起来像你有基于权限的查找。在获取当前用户之后放置一个断点,并确保它具有与您正在查找的权限(Constants.SECURITY_ROLE_CODE_ADMIN)相匹配的权限。