EF Core бритвенные страницы с включенным, затем включенным. Отображение строки вместо идентификатора - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть модели 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...