使用主细节linq语句的ViewModel索引
本文关键字:ViewModel 索引 语句 linq 细节 | 更新日期: 2023-09-27 18:13:55
我是ASP新手。. NET和MVC,所以请忍受我。我有两个模型:
public class Change
{
public int ID { get; set; }
public string Title { get; set; }
// more fields
public virtual ICollection<ChangeHistory> ChangeHistory { get; set; }
}
和
public class ChangeHistory
{
public int ID { get; set; }
public int ChangeID { get; set; }
public DateTime Date {get; set; }
public Status Status {get; set; }
}
目前,我的Changes视图只是简单地列出表中的所有更改及其详细信息(ID, Title等)。我想从详细信息表中添加几列,例如初始化日期(给定更改的第一个ChangeHistory项的日期)和当前状态&日期(都是从给定更改的最后一个ChangeHistory项中检索的)
我首先创建了一个新的ViewModel:
public class ChangeViewModel
{
// Take these details from the change record
public int ID { get; set; }
public string Title { get; set; }
public string Description { get; set; }
// Take these details from the first change history record
public DateTime InitiationDate { get; set; }
// Take these details from the latest change history record
public DateTime StatusDate { get; set; }
public Status CurrentStatus { get; set; }
}
在我的ChangesController中,在我缺乏经验阻止我之前,我已经检索了起始日期:
var ChangeWithStatus = from c in db.Changes
from h in db.ChangeHistories
where c.ID == h.ChangeID && h.Date ==
(
from h2 in db.ChangeHistories
where c.ID == h2.ChangeID
select h2.Date
).Min()
select new ChangeViewModel
{
// Change details
ID = c.ID,
Title = c.Title,
Description = c.Description,
// Initiation details
InitiationDate = h.Date,
Initiator = h.User,
// Status details
StatusDate = h.Date,
CurrentStatus = h.Status,
User = h.User
};
我想知道的解决方案是检索每个ChangeHistory记录与自己的linq语句,然后将它们与第三。有人能帮我解决这个问题吗?
应该可以:
var changeViewModels = (from change in db.Changes
let lastChangeHistory = change.ChangeHistory.OrderByDescending(changeHistory => changeHistory.Date).FirstOrDefault()
let firstChangeHistory = change.ChangeHistory.OrderBy(changeHistory => changeHistory.Date).FirstOrDefault()
select new ChangeViewModel
{
ID = change.ID,
Title = change.Title,
Description = change.Description,
InitiationDate = firstChangeHistory.Date,
StatusDate = lastChangeHistory.Date,
CurrentStatus = lastChangeHistory.Status,
}).ToList();
使用let子句:
let lastChangeHistory = change.ChangeHistory.OrderByDescending(changeHistory => changeHistory.Date).FirstOrDefault()
将为您提供每次更改的最后更改历史。而这一行:
let firstChangeHistory = change.ChangeHistory.OrderBy(changeHistory => changeHistory.Date).FirstOrDefault()
现在您拥有了所需的所有数据,并且可以将其选择到ChangeViewModel中。