You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在同一视图展示多实体数据并按客户分组显示最新评论

实现按客户分组展示客户及项目的最新评论表格

要实现你想要的分组表格展示,我们可以分为数据准备和视图渲染两个核心步骤。下面是具体的实现方案:


1. 定义视图模型(ViewModel)

为了避免直接传递领域实体到视图(同时减少不必要的数据加载),我们先创建两个视图模型来封装需要展示的数据:

public class ClientWithProjectsViewModel
{
    // 客户名称
    public string ClientName { get; set; }
    // 客户最新评论(若无则为null)
    public string LatestClientComment { get; set; }
    // 该客户下的项目列表(含最新评论)
    public List<ProjectWithCommentViewModel> Projects { get; set; }
}

public class ProjectWithCommentViewModel
{
    // 项目名称
    public string ProjectName { get; set; }
    // 项目最新评论(若无则为null)
    public string LatestProjectComment { get; set; }
}

2. 从数据库查询数据(EF Core)

使用EF Core的LINQ查询,高效获取每个客户的最新评论,以及其下每个项目的最新评论。这里假设你只需要活跃客户和未归档项目,如果需要调整过滤条件可以修改Where子句:

// 注入你的DbContext
private readonly AppDbContext _context;

public async Task<IActionResult> Index()
{
    var clientData = await _context.Clients
        // 过滤活跃客户(可根据需求调整)
        .Where(c => c.IsActive)
        .Select(c => new ClientWithProjectsViewModel
        {
            ClientName = c.ClientName,
            // 获取客户最新评论:按更新时间倒序取第一条
            LatestClientComment = c.ClientComments
                .OrderByDescending(cc => cc.LastUpdateDate)
                .Select(cc => cc.StatusComment)
                .FirstOrDefault(),
            // 获取该客户下的未归档项目及每个项目的最新评论
            Projects = c.Projects
                .Where(p => !p.IsArchived)
                .Select(p => new ProjectWithCommentViewModel
                {
                    ProjectName = p.ProjectName,
                    LatestProjectComment = p.ProjectComments
                        .OrderByDescending(pc => pc.LastUpdateDate)
                        .Select(pc => pc.StatusComment)
                        .FirstOrDefault()
                })
                .ToList()
        })
        .ToListAsync();

    return View(clientData);
}

关键说明:

  • 使用Select直接投影到视图模型,避免加载实体的冗余属性,提升查询效率。
  • 通过OrderByDescending + FirstOrDefault获取每个实体的最新评论,这比先加载所有评论再在内存中筛选更高效(数据库层面完成排序和筛选)。

3. 视图渲染(Razor视图示例)

在Razor视图中,遍历客户数据,先渲染客户行(加粗区分),再渲染其下的所有项目行:

<table class="table table-bordered">
    <thead>
        <tr>
            <th>名称</th>
            <th>最新评论</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var client in Model)
        {
            <!-- 客户行:加粗显示区分 -->
            <tr style="font-weight: bold;">
                <td>@client.ClientName</td>
                <td>@(client.LatestClientComment ?? "暂无评论")</td>
            </tr>

            <!-- 项目行:缩进或普通样式 -->
            @foreach (var project in client.Projects)
            {
                <tr>
                    <td>&nbsp;&nbsp;@project.ProjectName</td> <!-- 可选:添加缩进区分层级 -->
                    <td>@(project.LatestProjectComment ?? "暂无评论")</td>
                </tr>
            }
        }
    </tbody>
</table>

样式优化建议:

  • 可以通过CSS给客户行添加背景色或边框,让分组更清晰。
  • 给项目行添加左侧缩进(如示例中的&nbsp;&nbsp;或CSS的padding-left),增强层级感。

4. 扩展说明

  • 如果需要包含归档项目或非活跃客户,只需移除对应Where过滤条件即可。
  • 若评论内容较长,可以添加文本截断或悬浮提示(使用CSS或JavaScript)。
  • 确保你的DbContext中已正确配置实体间的导航关系(如Client与Project、ClientComment的关联),否则查询会报错。

内容的提问来源于stack exchange,提问作者Bernard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:26:21