| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- using System.Data;
- namespace Admin.NET.Plugin.AiDOP.Service.S8.Rules.DataAccess;
- /// <summary>
- /// S8 监控数据的 canonical 结果集。
- ///
- /// 承担原先 <see cref="DataTable"/> 的两个职责:承载行、回答"结果集是否含某列"。
- /// 后者是 evaluator canonical→params 回退逻辑的输入,语义必须与 DataTable.Columns.Contains 一致
- /// (列集合在整个结果集内稳定,因此在结果集层面回答,而不是逐行判断)。
- /// </summary>
- public sealed class S8MonitoringRowSet
- {
- private readonly HashSet<string> _columns;
- private S8MonitoringRowSet(IReadOnlyList<S8MonitoringRow> rows, HashSet<string> columns)
- {
- Rows = rows;
- _columns = columns;
- }
- /// <summary>结果集行。</summary>
- public IReadOnlyList<S8MonitoringRow> Rows { get; }
- /// <summary>结果集列名(去重,OrdinalIgnoreCase)。</summary>
- public IReadOnlyCollection<string> Columns => _columns;
- /// <summary>结果集是否包含该列。驱动 evaluator 的 canonical 优先 / params 回退分支。</summary>
- public bool HasColumn(string? columnName) =>
- !string.IsNullOrWhiteSpace(columnName) && _columns.Contains(columnName!);
- /// <summary>空结果集。</summary>
- public static S8MonitoringRowSet Empty { get; } =
- new(Array.Empty<S8MonitoringRow>(), new HashSet<string>(StringComparer.OrdinalIgnoreCase));
- /// <summary>由 Legacy SQL / API 取数结果构造。保留全部列,供 payload 落盘与 params 回退使用。</summary>
- public static S8MonitoringRowSet FromDataTable(DataTable table)
- {
- var columns = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
- foreach (DataColumn column in table.Columns)
- columns.Add(column.ColumnName);
- var rows = new List<S8MonitoringRow>(table.Rows.Count);
- foreach (DataRow row in table.Rows)
- rows.Add(S8MonitoringRow.FromDataRow(row));
- return new S8MonitoringRowSet(rows, columns);
- }
- /// <summary>
- /// 由标准 Provider 产出的 canonical 行构造。列集合取所有行键的并集
- /// (标准 Provider 各行结构一致,取并集可容忍可选列在部分行缺失)。
- /// </summary>
- public static S8MonitoringRowSet FromRows(IEnumerable<S8MonitoringRow> rows)
- {
- var list = rows as IReadOnlyList<S8MonitoringRow> ?? rows.ToList();
- var columns = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
- foreach (var row in list)
- foreach (var key in row.Values.Keys)
- columns.Add(key);
- return new S8MonitoringRowSet(list, columns);
- }
- }
|