C# ASP.NET WebForms按RegId分组展示Title与URL列表的实现方法
实现方案
你可以选择两种方案实现需求,分别是在C#后端对已拿到的DataTable做分组处理,或是直接修改存储过程在SQL层面完成分组拼接:
方案1:C#端处理(无需修改现有存储过程)
步骤1:引入所需命名空间
在你后台代码的顶部引入以下命名空间:
using System.Linq; using System.Text;
步骤2:在按钮点击事件中添加分组逻辑
在你填充完DataTable的代码之后,追加如下代码:
// 按RegId和用户名分组 var regGroups = dataTable.AsEnumerable() .GroupBy(row => new { RegId = row.Field<int>("RegId"), UserName = row.Field<string>("UserName") // 请替换为你表中实际存储用户名的字段名 }) .ToList(); StringBuilder resultBuilder = new StringBuilder(); foreach (var group in regGroups) { // 拼接当前用户下所有Title+URL组合 var urlItems = group.Select(row => $"{row.Field<string>("Title")} at {row.Field<string>("URL")}").ToList(); string formatItems; if (urlItems.Count == 1) { formatItems = urlItems[0]; } else { // 最后一项前加and,符合你要的展示效果 formatItems = string.Join(", ", urlItems.Take(urlItems.Count - 1)) + " and " + urlItems.Last(); } resultBuilder.AppendLine($"{group.Key.UserName} has {formatItems}."); resultBuilder.AppendLine(); // 不同用户之间加空行 } // 页面上提前添加<asp:Literal ID="ltResult" runat="server" Mode="PassThrough" /> 控件用于展示结果 ltResult.Text = resultBuilder.ToString();
方案2:修改存储过程(SQL层面分组,数据量大时性能更优)
如果你使用的是SQL Server 2017及以上版本,可以直接用STRING_AGG函数在存储过程中完成分组拼接,减少后端处理逻辑:
修改后的存储过程代码
USE [MyDB] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[spGetRegSess] AS BEGIN SET NOCOUNT ON; SELECT RegId, UserName, STRING_AGG(CONCAT(Title, ' at ', URL), ', ') WITHIN GROUP (ORDER BY Title) AS SessList FROM RegSess GROUP BY RegId, UserName END
对应的后端C#代码
存储过程修改后,后端无需再做分组,直接遍历结果即可:
StringBuilder resultBuilder = new StringBuilder(); foreach (DataRow row in dataTable.Rows) { string userName = row.Field<string>("UserName"); string sessList = row.Field<string>("SessList"); // 处理最后一个逗号替换为and int lastCommaIndex = sessList.LastIndexOf(','); if (lastCommaIndex != -1) { sessList = sessList.Remove(lastCommaIndex, 1).Insert(lastCommaIndex, " and"); } resultBuilder.AppendLine($"{userName} has {sessList}."); resultBuilder.AppendLine(); } ltResult.Text = resultBuilder.ToString();
注意事项
- 所有代码中的字段名请和你实际RegSess表的字段名保持一致,避免运行时报错
- 若需要将URL展示为可点击的链接,拼接字符串时替换为
<a href="{URL}" target="_blank">{Title}</a>格式即可
内容的提问来源于stack exchange,提问作者jtram
相关产品推荐
相关产品推荐

