MVC中如何基于Distinct生成含客户状态统计的表格?
解决客户状态统计表格的问题
看起来你当前的代码仅获取了去重后的客户列表,但还没实现每个客户各状态的数量统计功能。我来帮你完善整个逻辑,分Controller和View两部分落地:
第一步:完善Controller的统计逻辑
你需要对数据按vchClient分组,再在每个分组内统计不同vchStatus的记录数,同时保留你原本的日期筛选逻辑。调整后的代码如下:
public ActionResult ReportesClient(String fromDay = null, String toDay = null) { var query = entidad.tblKaizens.AsQueryable(); // 处理日期筛选:先验证日期格式有效性 if (!string.IsNullOrEmpty(fromDay) && !string.IsNullOrEmpty(toDay)) { if (DateTime.TryParse(fromDay, out DateTime startDate) && DateTime.TryParse(toDay, out DateTime endDate)) { // 替换这里的`DateField`为你模型中实际的日期字段(比如dtCreated) query = query.Where(r => r.DateField >= startDate && r.DateField <= endDate); } } // 分组统计:按客户分组,再统计各状态的数量 var clientStatusStats = query .GroupBy(r => r.vchClient) .Select(g => new { ClientName = g.Key, // 将每个客户的状态-数量映射为字典,方便View调用 StatusCounts = g.GroupBy(s => s.vchStatus) .ToDictionary(sg => sg.Key, sg => sg.Count()) }) .ToList(); return View(clientStatusStats); }
第二步:在View中渲染统计表格
创建对应的View(比如ReportesClient.cshtml),把统计数据渲染成清晰的表格,支持动态展示所有状态列:
@{ ViewBag.Title = "客户状态统计报表"; } <h2>客户状态统计报表</h2> <table class="table table-bordered"> <thead> <tr> <th>客户名称</th> <!-- 动态获取所有唯一状态,避免硬编码表头 --> @{ var allStatuses = Model.SelectMany(m => m.StatusCounts.Keys).Distinct(); foreach (var status in allStatuses) { <th>@status</th> } } <th>总记录数</th> </tr> </thead> <tbody> @foreach (var client in Model) { <tr> <td>@client.ClientName</td> @foreach (var status in allStatuses) { <!-- 若客户无该状态记录,显示0 --> <td>@(client.StatusCounts.TryGetValue(status, out var count) ? count : 0)</td> } <td>@client.StatusCounts.Sum(kv => kv.Value)</td> </tr> } </tbody> </table>
额外提示
- 记得把代码中的
DateField替换为你模型里实际的日期字段名称(比如dtCreated) - 如果你的
vchStatus是固定枚举值,可以直接硬编码表头,这样性能会更优 - 可以在页面添加日期筛选表单,让用户输入起始/结束日期后提交到这个Action
内容的提问来源于stack exchange,提问作者Jorge Reyes
相关产品推荐
相关产品推荐

