Как можно отобразить данные из нескольких объектов в одном представлении и сгруппировать их по одному объекту - PullRequest
0 голосов
/ 30 октября 2019

У меня есть клиенты, проекты, комментарии клиентов и комментарии к проектам. Я хочу отобразить одну таблицу, сгруппированную по клиенту, за которой следуют все проекты, и для каждого клиента, в котором есть комментарий, а также для каждого проекта, в котором есть комментарий, отображается последний предоставленный комментарий.

Таблица будет иметь клиентаИмя вверху, за которым следует последний соответствующий комментарий, если он указан. За ним следует список всех проектов для этого клиента с последним комментарием, если он предоставлен.

У меня есть модель клиента:

    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 bool IsArchived { get; set; }

        public ICollection<ProjectComment> ProjectComments { get; set; }

Модель комментария клиента:

    public class ClientComment
    {
        public int Id { get; set; }
        public int? ClientId { get; set; }
        public Client Client { get; set; }

        public string StatusComment { get; set; }
        public DateTime LastUpdateDate { get; set; }
        public ClientComment ()
        {
            this.LastUpdateDate = DateTime.UtcNow;
        }

Модель комментария проекта:

    public class ProjectComment
    {

        public int Id { get; set; }

        public int? ProjectId { get; set; }
        public Project Project { get; set; }

        public string StatusComment { get; set; }
        public DateTime LastUpdateDate { get; set; }
        public ProjectComment ()
        {
            this.LastUpdateDate = DateTime.UtcNow;
        }

Конечный результат должен быть с соответствующими заголовками таблицы:

ClientName1    | ClientStatusComment
ProjectName1   | ProjectStatusComment
ProjectName2   | ProjectStatusComment
ProjectName3   | ProjectStatusComment

ClientName2    | ClientStatusComment
ProjectName1   | ProjectStatusComment
ProjectName2   | ProjectStatusComment
ProjectName3   | ProjectStatusComment

1 Ответ

0 голосов
/ 31 октября 2019

Вы можете использовать View Model, которая содержит свойства, которые необходимо отобразить в представлении. См. Следующее:

  1. ClientVM и ProjectVM

    public class ClientVM
    {
      public string ClientName { get; set; }
      public string ClientStatusComment { get; set; }
      public List<ProjectVM> Projectlist { get; set; }
    }
    
    public class ProjectVM
    {
      public string ProjectName { get; set; }
      public string ProjectStatusComment { get; set; }
    }
    
  2. Заполнение ViewModel

    public class ClientsDetailsModel : PageModel
    {
     private readonly MyDbContext _context;
    
     public ClientsDetailsModel(MyDbContext context)
    {
        _context = context;
    } 
    
    [BindProperty]
    public List<ClientVM> clientVMList { get; set; }
    
    public async Task<IActionResult> OnGet()
    {
        var clientlist = _context.Clients
            .Include(c => c.ClientComments)
            .Include(c => c.Projects)
                .ThenInclude(p => p.ProjectComments).ToList();
    
        clientVMList = new List<ClientVM>();
    
        foreach (var item in clientlist)
        {
            ClientVM clientVM = new ClientVM()
            {
                Projectlist = new List<ProjectVM>()
            };
            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();
                projectVM.ProjectName = projectItem.ProjectName;
                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();
     }
    }
    
  3. ClientsDetails.cshtml

    @page
    @model MultipleEntitiesInSameView.Pages.ClientsDetailsModel
    
    <table class="table">
     <thead>
        <tr>
            <th>
                Name
            </th>
            <th>
                LastStatusComment
            </th>
            <th></th>
        </tr>
     </thead>
     <tbody>
        @foreach (var item in Model.clientVMList)
        {
            <tr style="background-color:aliceblue;">
                <td>
                    @Html.DisplayFor(modelItem => item.ClientName)
    
                </td>
    
                <td>
                    @Html.DisplayFor(modelItem => item.ClientStatusComment)
                </td>
            </tr>
            @foreach (var projectItem in item.Projectlist)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => projectItem.ProjectName)
    
                    </td>
    
                    <td>
                        @Html.DisplayFor(modelItem => projectItem.ProjectStatusComment)
                    </td>
                </tr>
    
            }
        }
     </tbody>
    </table>
    

4.Результат: enter image description here

...