У меня есть модели Client, Project, ClientComment, ProjectComment, ProjectStatus, RAGStatus и Resource. Я отображаю таблицу связанных с клиентом и связанных с проектом комментариев, сгруппированных по клиенту.
Мне нужно добавить связанные ProjectStatus, RAGStatus и Resource в мою таблицу, но я не смог подключить дополнительные сущностив моем запросе Include / ThenInclude.
ProjectStatus, RAGStatus и Resource связаны через ViewData / VieWBag в раскрывающихся меню и, следовательно, сохраняют соответствующий Id (не фактическую строку) в ClientComment, Project иТаблицы ProjectComment.
Я попытался создать ViewModel для ProjectStatus, RAGStatus и Resource, но мне не удалось найти правильную комбинацию Include / ThenInclude для отображения всей необходимой мне информации в моей таблице.
Модель клиента:
public class Client
{
public int Id { get; set; }
public string ClientName { get; set; }
public bool IsActive { get; set; }
public ICollection<ClientComment> ClientComments { get; set; }
public ICollection<Project> Projects { get; set; }
}
Модель проекта:
public class Project
{
public int Id { get; set; }
public string ProjectName { get; set; }
public int ClientId { get; set; }
public Client Client { get; set; }
public int ProjectStatusId { get; set; }
public ProjectStatus ProjectStatus { get; set; }
public int ResourceId { get; set; }
public Resource Resource { get; set; }
public bool IsArchived { get; set; }
public ICollection<ProjectComment> ProjectComments { get; set; }
}
Модель ClientComment:
public class ClientComment
{
public int Id { get; set; }
public int? ClientId { get; set; }
public Client Client { get; set; }
public int RAGStatusId { get; set; }
public RAGStatus RAGStatus { get; set; }
public string StatusComment { get; set; }
public string EscalationComment { get; set; }
public string GeneralComment { get; set; }
public double? EOQ { get; set; }
public DateTime LastUpdateDate { get; set; }
public ClientComment ()
{
this.LastUpdateDate = DateTime.UtcNow;
}
Модель ProjectComment:
public class ProjectComment
{
public int Id { get; set; }
public int? ProjectId { get; set; }
public Project Project { get; set; }
public int RAGStatusId { get; set; }
public RAGStatus RAGStatus { get; set; }
public string StatusComment { get; set; }
public string EscalationComment { get; set; }
public string GeneralComment { get; set; }
public double? EOQ { get; set; }
public DateTime LastUpdateDate { get; set; }
public ProjectComment ()
{
this.LastUpdateDate = DateTime.UtcNow;
}
Модель ProjectStatus:
public class ProjectStatus
{
public int Id { get; set; }
public string ProjectStatusName { get; set; }
public bool IsActive { get; set; }
public ICollection<Project> Projects { get; set; }
}
Модель RAGStatus:
public class RAGStatus
{
public int Id { get; set; }
public string RAGStatusName { get; set; }
public ICollection<ClientComment> ClientComments { get; set; }
public ICollection<ProjectComment> ProjectComments { get; set; }
public bool IsActive { get; set; }
}
Модель ресурсов:
public class Resource
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string LongName { get; set; }
public bool IsActive { get; set; }
public ICollection<Project> Projects { get; set; }
}
Модель ClientVM:
public class ClientVM
{
public string ClientName { get; set; }
public int ClientId { get; set; }
public int ClientCommentId { get; set; }
public string ClientStatusComment { get; set; }
public int RAGStatusId { get; set; }
public List<ProjectVM> Projectlist { get; set; }
public List<RAGStatusVM> RAGStatuslist { get; set; }
}
Модель ProjectVM:
public class ProjectVM
{
public int ProjectId { get; set; }
public string ProjectName { get; set; }
public string ProjectStatusComment { get; set; }
public int RAGStatusId { get; set; }
public int ProjectStatusId { get; set; }
public int ResourceId { get; set; }
}
Модель страницы:
[BindProperty]
public List<ClientVM> ClientVMList { get; set; }
public List<ProjectVM> ProjectVMList { get; set; }
public List<ResourceVM> ResourceVMList { get; set; }
public List<ProjectStatusVM> ProjectstatusVMList { get; set; }
public List<RAGStatusVM> RAGstatusVMList { get; set; }
public async Task<IActionResult> OnGet()
{
var clientlist = await _context.Client
.Include(c => c.ClientComments)
.ThenInclude(cr => cr.RAGStatus)
.Include(c => c.Projects)
.ThenInclude(p => p.ProjectComments)
.ThenInclude(pr => pr.RAGStatus).ToListAsync();
ClientVMList = new List<ClientVM>();
foreach (var item in clientlist)
{
ClientVM clientVM = new ClientVM()
{
Projectlist = new List<ProjectVM>()
};
clientVM.ClientId = item.Id;
clientVM.ClientName = item.ClientName;
if (item.ClientComments != null && item.ClientComments.Any())
{
clientVM.ClientStatusComment = item.ClientComments.OrderByDescending(cc => cc.LastUpdateDate).First().StatusComment;
}
else
{
clientVM.ClientStatusComment = "No StatusComment";
}
foreach (var projectItem in item.Projects)
{
ProjectVM projectVM = new ProjectVM
{
ProjectId = projectItem.Id,
ProjectName = projectItem.ProjectName,
ProjectStatusId = projectItem.ProjectStatusId,
ResourceId = projectItem.ResourceId
};
if (projectItem.ProjectComments != null && projectItem.ProjectComments.Any())
{
projectVM.ProjectStatusComment = projectItem.ProjectComments.OrderByDescending(pc => pc.LastUpdateDate).First().StatusComment;
}
else
{
projectVM.ProjectStatusComment = "No StatusComment";
}
clientVM.Projectlist.Add(projectVM);
}
ClientVMList.Add(clientVM);
}
return Page();
}
Client1 |ClientStatusComment |РАГСтатус |ResourceName
Project1 |ProjectStatusComment |РАГСтатус |ResourceName |ProjectStatusName
Project2 |ProjectStatusComment |РАГСтатус |ResourceName |ProjectStatusName
Client2 |ClientStatusComment |РАГСтатус |ResourceName
Project1 |ProjectStatusComment |РАГСтатус |ResourceName |ProjectStatusName
Project2 |ProjectStatusComment |РАГСтатус |ResourceName |ProjectStatusName