SQL Server/.NET通用指标页面DataReader类型转换代码优化问询
问题:SQL Server指标通用网页的字段转换代码优化
我正在开发一款SQL Server指标通用网页,指标可来自查询或存储过程,涉及不同数据库与表,需规整展示。URL示例:
localhost:0000/Metric/framework?database=db1&table=t1&records=100 OR localhost:0000/Metric/framework?database=db1&table=t2&records=100 OR localhost:0000/Metric/framework?database=db2&table=t9&records=10
已完成功能:
- 从URL动态获取参数
- 创建SQL连接
- 执行查询/存储过程
- 将所有字段转为String类型
- 展示结果
- 通过模型生成表格表头
当前实现存在的问题:
需要根据字段数量在model中添加fieldname_n、field_n字段,且每个字段需编写大量重复代码转换为字符串。后续用Convert.ToString(reader.GetValue(n))简化了转换,但仍需逐个字段赋值,代码冗余:
frameworkInfo framework= new frameworkInfo(); framework.field_0 = Convert.ToString(reader.GetValue(0)); framework.fieldname_0 = (reader.GetName(0).ToString()); // ... 其他字段代码 frameworks.Add(framework)
现寻求进一步优化方案,实现类型转换代码的最小化编码量?
优化方案
1. 修改模型结构,使用动态字段集合
放弃固定的field_n和fieldname_n字段,改用键值对列表存储字段名和对应值,适配任意数量的字段:
定义模型类:
public class FrameworkInfo { public List<KeyValuePair<string, string>> Fields { get; set; } = new List<KeyValuePair<string, string>>(); }
读取数据时循环遍历所有字段,批量添加到集合:
var framework = new FrameworkInfo(); for (int i = 0; i < reader.FieldCount; i++) { string fieldName = reader.GetName(i); string fieldValue = Convert.ToString(reader.GetValue(i)); framework.Fields.Add(new KeyValuePair<string, string>(fieldName, fieldValue)); } frameworks.Add(framework);
2. 使用动态对象(ExpandoObject)
如果不需要强类型模型,用ExpandoObject动态添加属性,无需提前定义固定模型:
var frameworks = new List<dynamic>(); while (reader.Read()) { dynamic framework = new ExpandoObject(); var fieldDict = (IDictionary<string, object>)framework; for (int i = 0; i < reader.FieldCount; i++) { string fieldName = reader.GetName(i); fieldDict[fieldName] = Convert.ToString(reader.GetValue(i)); } frameworks.Add(framework); }
这种方式完全适配任意字段数量,无需修改模型代码。
3. 封装通用转换方法
若需保留强类型,封装通用方法复用转换逻辑:
public static List<KeyValuePair<string, string>> ReadAllFields(SqlDataReader reader) { var fields = new List<KeyValuePair<string, string>>(); for (int i = 0; i < reader.FieldCount; i++) { fields.Add(new KeyValuePair<string, string>( reader.GetName(i), Convert.ToString(reader.GetValue(i)) )); } return fields; }
使用时直接调用:
framework.Fields = ReadAllFields(reader);
4. 前端表格适配优化
修改模型后,前端动态遍历字段集合生成表头和内容(以Razor语法为例):
<table> <thead> <tr> @foreach(var field in frameworks.First().Fields) { <th>@field.Key</th> } </tr> </thead> <tbody> @foreach(var item in frameworks) { <tr> @foreach(var field in item.Fields) { <td>@field.Value</td> } </tr> } </tbody> </table>
以上方案可彻底消除重复的字段赋值代码,实现真正的通用化适配。
内容的提问来源于stack exchange,提问作者phillismable
相关产品推荐
相关产品推荐

