使用 LINQ to Entities 中的数据填充包含另一个 ViewModel 的 ViewModel

Filling a ViewModel that contains other ViewModels with data from LINQ to Entites

我刚刚完成了我的第一个综合体,嗯,我认为它很复杂,ViewModel。它包含嵌套的 ViewModels,我很难弄清楚如何使用 LINQ to Entities 用数据填充整个图表。我该如何填充整个图表?

我的视图模式:

public class TimesheetWeeklyTableVM
{
    public int TimesheetHeaderID { get; set; }
    //public DateTime weekEndingDate { get; set; }
    public decimal TotalWeekHours { get; set; }

    public List<TimesheetDailyVM> DaysOfWeek { get; set; }

    public TimesheetWeeklyTableVM(DateTime weekEndingDate)
    {
        DaysOfWeek = new List<TimesheetDailyVM>();

        for (var i = 6; i >= 0; i--)
        {
            DaysOfWeek.Add(new TimesheetDailyVM()
            {
                CurrentDate = weekEndingDate.AddDays(-i)
            });
        }
    }
}

public class TimesheetDailyVM
{
    public DateTime CurrentDate { get; set; }

    public double TotalHours
    {
        get
        {
            return TimeSpan.FromSeconds(Tasks.Sum(p => (p.StartDateTime - p.EndDateTime).TotalSeconds)).TotalHours;
        }
    }

    public IEnumerable<TimesheetDailyHoursVM> Tasks { get; set; }

    public TimesheetDailyVM()
    {
        Tasks = new List<TimesheetDailyHoursVM>();
    }
}

public class TimesheetDailyHoursVM
{
    public int TimesheetID { get; set; }
    public DateTime StartDateTime { get; set; }
    public DateTime EndDateTime { get; set; }
    public string ProjectCode { get; set; }
    public string ProjectDescription { get; set; }
    public string TaskCode { get; set; }
    public string TaskDescription { get; set; }
}

我将把数据形式提取到上面的实体:

public class TimesheetHeader
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    public int EmployeeID { get; set; }
    public DateTime WeekEndingDate { get; set; }
    public decimal TotalHours { get; set; }
    public int CurrentStatusID { get; set; }

    public decimal OtherPay { get; set; }
    public int? ApprovedByID { get; set; }
    public DateTime? DateSubmitted { get; set; }
    public DateTime? DateApproved { get; set; }

    [Column(TypeName = "varchar(MAX)")]
    public string ManagerNotes { get; set; }

    [ForeignKey("EmployeeID")]
    public Employee Employee { get; set; }

    [ForeignKey("ApprovedByID")]
    public Employee ApprovedBy { get; set; }

    [ForeignKey("CurrentStatusID")]
    public StatusOption CurrentStatus { get; set; }
}

public class Timesheet
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    public int TimesheetHeaderID { get; set; }
    public DateTime StartDateTime { get; set; }
    public DateTime EndDateTime { get; set; }
    public string ProjectCode { get; set; }
    public string TaskCode { get; set; }

    [Column(TypeName = "varchar(MAX)")]
    public string WorkDescription { get; set; }

    [ForeignKey("TimesheetHeaderID")]
    public TimesheetHeader TimesheetHeader { get; set; }
}

到目前为止我要填写的代码:

            var weekEndingDate = TimesheetHelper.GetWeekEndingDate(date);

            using (var db = new JobSightDbContext())
            {
                var model = db.TimesheetHeaders
                              .Where(timesheet => timesheet.WeekEndingDate == weekEndingDate)
                              .Select(timesheet => new TimesheetWeeklyTableVM(weekEndingDate)
                              {
                                  TimesheetHeaderID = timesheet.ID,
                                  TotalWeekHours = timesheet.TotalHours
                              }).FirstOrDefault();

                model.DaysOfWeek = db.Timesheets
                                     .Where(timesheet => timesheet.TimesheetHeaderID == model.TimesheetHeaderID)
                                     .OrderBy(timesheet => timesheet.StartDateTime)
                                     .Select(timesheet => new TimesheetDailyVM()
                                     {   
                                         Tasks.TimesheetID = timesheet.ID,
                                         StartDateTime = timesheet.StartDateTime,
                                         EndDateTime = timesheet.EndDateTime,
                                         ProjectCode = timesheet.ProjectCode,
                                         TaskCode = timesheet.TaskCode
                                     }).ToList();

                return PartialView(model);
            }

这段代码给出了错误 "The name 'Tasks' does not exist in the current context. INvalid initializer member declaratory" 和 "TimesheeDailyVM does not contain a definition for 'XXX'"

如果我尝试将大小写转换为 TimesheetDailyHoursVM,则会出现隐式转换错误。

假设您要显示一周中每一天的记录,您需要按日期对 Timesheet 条记录进行分组,并将每个相应的组添加到关联的 Tasks 属性对应日

var timeRecords = db.Timesheets
    .Where(x => x.TimesheetHeaderID == model.TimesheetHeaderID)
    .Groupby(x => x.StartDateTime);

foreach(var group in timeRecords)
{
    var index = // see notes below
    model.DaysOfWeek[index].Tasks = group.Select(x => new TimesheetDailyHoursVM()
    {
        TimesheetID = x.ID,
        StartDateTime = x.StartDateTime,
        ....
    });
}

上面的index需要根据group.Key也就是StartDateTime。通常这将是

index = group.Key.DayOfWeek;

星期天是 0,星期一是 1,等等,但是在你的代码中你使用

for (var i = 6; i >= 0; i--)
{
    DaysOfWeek.Add(new TimesheetDailyVM()
    {
        CurrentDate = weekEndingDate.AddDays(-i)
    });
}

不清楚第一天是否真的是星期天