2

私は、各従業員が複数の役割を持ち、各役割の予想時間と実際の時間を含むExcelレポートを返すアプリケーションに取り組んでいます。たとえば、あるコラムでは開発者として、別のコラムでは BA としてリストされているかもしれません。使用しているクエリが空の結果セットを返しています。

    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;

        }







    }

私が省略したファイルのすべてのフォーマットと作成の大部分は、空の結果とは関係ありません。結果は次のようになります ここに画像の説明を入力

4

1 に答える 1

1

次の 3 つの点の少なくとも 1 つで失敗しています。

  1. データベース内のデータが検索対象を反映していることを確認します。これを行う最も簡単な方法は、変換された EF クエリをキャプチャして SQL ステートメントを表示できる何らかのプロファイラーを使用することです。linqpadは、これを行うための優れたツールです。

  2. マッピングを確認します。リレーションシップが正しくマッピングされていない可能性があり、生成するデータが生成されません。

  3. 独自の制約を確認します。アクセス許可ベースのルックアップがあるようです。現在のユーザーがフェッチされた後にブレークポイントを配置し、条件で探しているアクセス許可 ( Constants.SECURITY_ROLE_CODE_ADMIN) と一致するアクセス許可があることを確認します。

于 2013-01-23T20:06:00.787 に答える