我刚刚完成了第一个综合体的构建,那么我认为它很复杂ViewModel
。它包含嵌套ViewModels
,我很难弄清楚如何使用来填充数据LINQ to Entities
。我应该如何填满整个图表?
我的ViewMode:
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);
}
这段代码给我错误“在当前上下文中不存在名称'Tasks'。无效的初始化成员声明”和“ TimesheeDailyVM不包含'XXX'的定义”的错误。
如果我尝试插入case,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)
});
}
还不清楚第一天是否实际上是星期日
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句