通常情况下,我们在做工程项目的时候,需要把待处理的数据存储在数据库中。

通过 SQLSelect 语句很容易把查询的结果以 DataTable 的方式得到,但在对 DateTable 中的数据进行进一步的检索时远远没有模型类 List<T> 方便。 所以,在做工程项目时,会把查询到的 DataTable 转化成模型类 List<T>, 处理完毕后如果有所改动则把这个模型类 换回成 DataTable 以便完成数据库中的相应改动。

上周在做一个电力局项目时对导入的上万条数据进行插入操作就是这样做的,参见一下图文:

  • 如何利用 C# 向 Access 数据库插入大量数据?

技术分析

如何实现 DataTableList<T> 的相互转化呢?

这里需要掌握 C# 中的 泛型 以及 反射 的基础知识

泛型部分:

  • 泛型(一):泛型概述
  • 泛型(二):泛型的优点
  • 泛型(三):泛型之类型参数
  • 泛型(四):泛型之类型参数约束
  • 泛型(五):泛型类
  • 泛型(六):泛型接口
  • 泛型(七):泛型方法
  • 泛型(八):泛型委托
  • 泛型(九):泛型代码中的default关键字

反射部分:

  • 反射技术(一):前期准备
  • 反射技术(二):窥视内部
  • 反射技术(三):深入窥视字段
  • 反射技术(四):深入窥视属性
  • 反射技术(五):深入窥视方法
  • 反射技术(六):深入窥视DLL内部
  • 反射技术(七):通过反射实例化对象

通过泛型,我们可以把任何一个模型类 List<T> 转化成 DataTable,也可以把任何一个 DataTable 转化成对应的 List<T>,只要这里 T 类型的 public 属性DataTableColumnName 对应即可。当然属性的获取是通过反射技术完成的。

有关泛型和反射的知识,可以查看上面的图文,我在这里就不在重复了。


代码实现

下面,通过一个实际项目的例子来说明相互转换的代码与具体的应用。

Step1. 设备台账的结构 AcountItem

/// <summary>
/// 台账Item
/// </summary>
public class AccountItem
{/// <summary>/// 设备ID/// </summary>public string EquipmentId{get;set; }/// <summary>/// 厂站名称/// </summary>public string FactoryStationName{get;set; }/// <summary>/// 厂站类型/// </summary>public string FactoryStationType{get;set; }/// <summary>/// 一次设备名称/// </summary>public string PrimaryDeviceName { get; set; }/// <summary>/// 一次设备电压等级/// </summary>public string PrimaryDeviceVoltageLevel { get; set; }/// <summary>/// 制造厂家/// </summary>public string Manufacturer { get;set; }/// <summary>/// 保护类别/// </summary>public string ProtectionCategory {get;set;   }/// <summary>/// 保护型号/// </summary>public string ProtectionType {get;set; }/// <summary>/// 软件版本/// </summary>public string SoftwareVersion { get;set; }/// <summary>/// 保护名称/// </summary>public string ProtectionName {get;set; }/// <summary>/// 投运日期/// </summary>public string CommissionDate {get;set; }/// <summary>/// 出厂日期/// </summary>public string ProductionDate {get;set; }/// <summary>/// 所在屏柜/// </summary>public string ScreenCabinets {get;set; }/// <summary>/// 保护套别/// </summary>public string ProtectiveSleeve {get;set; }
}

Step2. 把模型类 List<T> 转化为 DataTable

public static DataTable ListToDataTable<T>(IEnumerable<T> collection)
{if (collection == null)throw new ArgumentNullException();PropertyInfo[] props = typeof (T).GetProperties();DataTable dt = new DataTable();dt.Columns.AddRange(props.Select(p => new DataColumn(p.Name, p.PropertyType)).ToArray());if (collection.Any()){for (int i = 0; i < collection.Count(); i++){ArrayList tempList = new ArrayList();foreach (PropertyInfo pi in props){object obj = pi.GetValue(collection.ElementAt(i), null);tempList.Add(obj);}object[] array = tempList.ToArray();dt.LoadDataRow(array, true);}}return dt;
}

Step3. 举例,把 List<AcountItem> 转化为 DataTable

// 初始化链表并加入数据。
List<AccountItem> lst = new List<AccountItem>(); DataTable dt = ListToDataTable(lst);

dt 数据表列集合的列名依次为:

  • EquipmentId
  • FactoryStationName
  • FactoryStationType
  • PrimaryDeviceName
  • PrimaryDeviceVoltageLevel
  • Manufacturer
  • ProtectionCategory
  • ProtectionType
  • SoftwareVersion
  • ProtectionName
  • CommissionDate
  • ProductionDate
  • ScreenCabinets
  • ProtectiveSleeve;

Step4. DataTable 转化为 List

public static List<T> DataTableToList<T>(DataTable dt) where T : new()
{List<T> result = new List<T>();foreach (DataRow dr in dt.Rows){T item = new T();PropertyInfo[] props = item.GetType().GetProperties();foreach (PropertyInfo pi in props){string tempName = pi.Name;if (dt.Columns.Contains(tempName)){if (pi.CanWrite == false)continue;object value = dr[tempName];if (value != DBNull.Value)pi.SetValue(item, value, null);}}result.Add(item);}return result;
}

Step5. 举例,把 Step3 得到的 DataTable 转化为 List<AccountItem>

List<AccountItem> lst = DataTableToList(dt);

通过调用 Step4 带约束的泛型方法,可以得到模型类 List<AccountItem>


总结

到此为止,DataTableList<T> 的相互转换就介绍完了,由于整个项目都是利用 List<T> 来构建逻辑的,所以整个系统可以具有良好的结构,通过 LINQ 也能满足效率的要求。今天就到这里吧!See You!


相关图文

  • 如何利用 C# 实现 K 最邻近算法?
  • 如何利用 C# 实现 K-D Tree 结构?
  • 如何利用 C# + KDTree 实现 K 最邻近算法?
  • 如何利用 C# 对神经网络模型进行抽象?
  • 如何利用 C# 实现神经网络的感知器模型?
  • 如何利用 C# 实现 Delta 学习规则?
  • 如何利用 C# 开发「桌面版百度翻译」软件!
  • 如何利用 C# 开发「股票数据分析软件」(上)
  • 如何利用 C# 开发「股票数据分析软件」(中)
  • 如何利用 C# 开发「股票数据分析软件」(下)
  • 如何利用 C# 爬取「财报说」中的股票数据?
  • 如何利用 C# 爬取 One 持有者返利数据!
  • 如何利用 C# 爬取Gate.io交易所的公告!
  • 如何利用 C# 爬取BigOne交易所的公告!
  • 如何利用 C# 爬取 ONE 的交易数据?
  • 如何利用 C# 爬取「京东 - 计算机与互联网图书销量榜」!
  • 如何利用 C# 爬取「当当 - 计算机与互联网图书销量榜」!
  • 如何利用 C# 爬取「互动出版网 - 计算机图书销量榜」!
  • 如何利用 C# 爬取「中国图书网 - 计算机与互联网图书销量榜」!
  • 如何利用 C# 爬取「猫眼电影:热映口碑榜」及对应影片信息!
  • 如何利用 C# 爬取「猫眼电影专业版:票房」数据!
  • 如何利用 C# 爬取「猫眼电影:最受期待榜」及对应影片信息!
  • 如何利用 C# 爬取「猫眼电影:国内票房榜」及对应影片信息!
  • 如何利用 C# + Python 破解猫眼电影的反爬虫机制?
  • 如何利用 C# 爬取带 Token 验证的网站数据?

技术图文:如何实现 DataTable 与模型类 List 的相互转换?相关推荐

  1. python自己做个定时器_技术图文:如何利用 Python 做一个简单的定时器类?

    原标题:技术图文:如何利用 Python 做一个简单的定时器类? 背景 今天在B站上看有关 Python 最火的一个教学视频 -- "零基础入门学习 Python",这也是我们 P ...

  2. go 连接服务器 并存放图片_基于 Go 语言开发在线论坛(二):通过模型类与MySQL数据库交互...

    在这篇教程中,我们将在 MySQL 中创建一个 chitchat 数据库作为论坛项目的数据库,然后在 Go 项目中编写模型类与之进行交互.你可以本地安装 MySQL 数据库,也可以基于 Docker ...

  3. dj鲜生-36-商品应用-其它模型类的创建-完善goods应用的数据表

    用户模块处理的差不多了 准备商品模块 总共七张表,要做模型类 原始models 就是一个空的 开始弄进去代码 开始打代码 商品模型类的定义 from django.db import models f ...

  4. 与mysql数据库的交互实战_基于 Go 语言开发在线论坛(二):通过模型类与MySQL数据库交互...

    在这篇教程中,我们将在 MySQL 中创建一个 chitchat 数据库作为论坛项目的数据库,然后在 Go 项目中编写模型类与之进行交互.你可以本地安装 MySQL 数据库,也可以基于 Docker ...

  5. 基于机器学习技术的用户行为分析:当前模型和应用研究综述(A survey for user behavior analysis based on machine learning technique)

    A survey for user behavior analysis based on machine learning techniques: current models and applica ...

  6. Django实践(二)——使用模型类定义数据表,实现表单页面跳转

    Django实践(二)--使用模型类定义数据表,实现表单页面跳转 1.设计和开发信息发布的数据防访问层 配置djangosite/settings.py中的INSTALLED_APPS,添加应用app ...

  7. 【发展史】自然语言处理中的预训练技术发展史—Word Embedding到Bert模型

    目录 自然语言处理中的预训练技术发展史-Word Embedding到Bert模型 1 图像领域的预训练 2 Word Embedding考古史 3 从Word Embedding到ELMO 4 从W ...

  8. 技术图文:排序技术在求解算法题中的应用

    背景 前段时间,在知识星球立了一个Flag,这是总结Leetcode刷题的第五篇图文. 理论部分 C# 中的排序 对集合类的排序,我们通常使用位于 System.Core 程序集,System.Lin ...

  9. Django博客系统注册(定义用户模型类)

    1. Django默认用户认证系统 Django自带用户认证系统 它处理用户账号.组.权限以及基于cookie的用户会话. Django认证系统位置 django.contrib.auth包含认证框架 ...

最新文章

  1. R语言使用aov函数进行单因素协方差分析(One-way ANCOVA)、使用multcomp包的glht函数检验组均值之间所有成对对比差异、通过contrast参数自定义对比组进行组间两两方差分析
  2. linux下创建多进程,linux之多进程fork:进程创建
  3. aws java mysql_AWS Serverless部署java api(RDS for MySQL篇)
  4. Python设计模式——观察者模式
  5. 使用Spring Security和OAuth 2.0保护Spring微服务架构
  6. MATLAB电压不平衡,电力系统不对称故障计算的Matlab算法程序
  7. 索引的正确“打开姿势”
  8. linux 自学系列:文件压缩
  9. CQ40 519TX不刷BIOS完美解决声卡问题方法
  10. 雅虎邮箱pop服务器,使用Yahoo.com.cn的POP和SMTP
  11. BUUCTF:[XMAN2018排位赛]file
  12. Rasa原文-生成NLU数据
  13. Java通过快递鸟-查询物流
  14. 【转】用生命之花制定自己的月计划
  15. Android之ScrollBar
  16. CALL入门篇一:CALL的本质
  17. 基于java的电脑配件报价网站系统
  18. Uncaught ReferenceError: UE is not defined at zh-cn.js:8
  19. 短视频平台翻唱歌曲时用注明原创吗
  20. 系统集成中通讯网关与各类仪表安装接线要求

热门文章

  1. php自动计算增长率,如何写sql计算增长率?
  2. 宝塔面板 mysql装不上_宝塔面板强制安装mysql8.0
  3. 计算机教师简介50字,教师风采个人简介50字数.docx
  4. 循环map_python函数 map函数—比for还好用的循环
  5. python邮件发送哪个好_最全总结!聊聊 Python 发送邮件的几种方式
  6. 2017年安全漏洞审查报告:安全补丁在不断增加,用户却不安装
  7. R语言通过loess去除某个变量对数据的影响
  8. java中的几种对象(PO,VO,DAO,BO,POJO)
  9. C# 格式串(收藏)
  10. 遇到的浏览器兼容问题及应对方法