使用 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)
});
}
不清楚第一天是否真的是星期天
我刚刚完成了我的第一个综合体,嗯,我认为它很复杂,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)
});
}
不清楚第一天是否真的是星期天