我有 3 个模型:
项目
public int ProjectID { get; set; }
public string Description { get; set; }
public string UserID { get; set; }
[ForeignKey("UserID")]
public virtual ApplicationUser User { get; set; }
public virtual ICollection<Job> Jobs { get; set; }
工作
public int JobID { get; set; }
public int ProjectID { get; set; }
public string Title { get; set; }
public string Jobdescription { get; set; }
public string UserID { get; set; }
[ForeignKey("UserID")]
public virtual ApplicationUser User { get; set; }
public virtual Project Projects { get; set; }
public virtual ICollection<Log> Logs { get; set; }
public virtual ICollection<Assignment> Assignments { get; set; }
原木
public int LogID { get; set; }
public int JobID { get; set; }
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd HH:mm}")]
public DateTime Logstart { get; set; }
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd HH:mm}")]
public DateTime Logend { get; set; }
public int totaltime { get; set; }
public string Notes { get; set; }
public string UserID { get; set; }
[ForeignKey("UserID")]
public virtual ApplicationUser User { get; set; }
public virtual Job Job { get; set; }
例如,我想在我的项目索引视图中拥有每个项目所有日志的所有"总时间"的总和。 在我的作业索引页面中,我可以通过在 foreach 循环中对这些总计求和来轻松做到这一点,如下所示:
@TimeSpan.FromMinutes(item.Logs.Sum(i => i.totaltime))
但是,我不知道如何在我的项目页面上做同样的事情,而无需创建视图模型或将 ProjectID 键添加到日志模型,以便我可以在项目索引页面上为项目执行上述操作。
我可以使用以下命令获取每个项目的第一个作业的总时间值:
@TimeSpan.FromMinutes(item.Jobs.Sum(i => i.Logs.First().totaltime))
但是我不知道如何写这个来汇总每个工作的所有"总时间"。
我想知道的是最好的方法是什么。 我是否必须以项目模型与作业模型相关的方式在日志模型中创建视图模型或添加与项目模型的关系。 我可能缺少的这些方法中的任何一种是否存在缺点或问题? 当然,有一种简单的方法可以让我使用上面使用的东西来获得项目的"总时间"吗?
正如你可能能够说的那样,我只是试图慢慢学习MVC。 谢谢。
您不需要使用视图模型,但我可能会建议您这样做。我更喜欢在视图之外进行所有处理,因此您需要在控制器中进行计算,并将总时间分配给视图模型中的属性。但是,在视图本身中完成相同的操作非常容易,只需向视图添加类似以下内容:
@{
var jobs = projects.Jobs;
var totalTime = jobs.Sum(job => job.Logs.Sum(x => x.totaltime));
}
<p>Total time is @totalTime</p>
使用视图模型来做到这一点,我强烈建议在控制器中进行操作以获得良好的架构,以便:
控制器:
var jobs = db.JobsList.ToList();
var totalTime = jobs.Sum(x => x.Logs).Sum(x => x.totaltime));