2013-01-23 75 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)相匹配的權限。