使用主细节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语句,然后将它们与第三。有人能帮我解决这个问题吗?

使用主细节linq语句的ViewModel索引

应该可以:

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中。