如何按指定参数排序DataTable统计行并获取Column1各distinct值对应行数
解决方案
存储过程侧统计逻辑
你可以在执行聚合插入操作之前,先对传入的表值参数做分组统计,暂存每个Column1对应的原始行数,不会影响后续的聚合逻辑:
SET NOCOUNT ON GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[myProcedure] @param myUserDefinedTableType readonly AS BEGIN TRANSACTION -- 提前统计每个Column1对应的全量行数 DECLARE @Column1Stats TABLE ( Column1 [这里替换为你Column1的实际数据类型], RowCount INT ) INSERT INTO @Column1Stats (Column1, RowCount) SELECT Column1, COUNT(*) FROM @param GROUP BY Column1 -- 原有聚合插入逻辑保持不变 INSERT INTO [dbo].[myTable] (/* 列名列表 */) SELECT [Column1], -- 其他列 FROM @param GROUP BY [Column2], [Column1] ORDER BY [Column2], [Column1] -- 原有UPDATE语句保持不变 -- 如需返回统计结果给应用层,直接加下面的查询即可 SELECT * FROM @Column1Stats ORDER BY Column1 COMMIT TRANSACTION
C#侧数据传递逻辑
你原有使用静态属性存行数的方式存在并发风险,多用户请求会出现数值覆盖问题,建议自定义数据结构关联Column1值、对应行数、关联原行三者的关系,直接在应用层统计也可以,不需要修改存储过程:
- 定义统计结果实体
public class Column1Statistic { // Column1的具体取值 public object Column1Value { get; set; } // 该取值对应的行数 public int RowCount { get; set; } // 关联的原始行数据,不需要追溯原行可以删除该字段 public List<DataRow> RelatedRows { get; set; } }
- 从DataTable生成统计结果
// 可在View层或数据访问层执行该逻辑 public List<Column1Statistic> CalculateColumn1Stats(DataTable originalDt) { return originalDt.AsEnumerable() .GroupBy(row => row["Column1"]) .OrderBy(group => group.Key) // 按Column1排序 .Select(group => new Column1Statistic { Column1Value = group.Key, RowCount = group.Count(), RelatedRows = group.ToList() }) .ToList(); }
- 将生成的
List<Column1Statistic>直接传给ViewModel即可,既可以拿到每个distinct值对应的行数,也可以按需追溯对应的原始行,不需要硬编码任何动态值。
内容的提问来源于stack exchange,提问作者user16600932
相关产品推荐
相关产品推荐

