(原创)一步步优化业务代码之——从数据库获取DataTable并绑定到List<Class>
一,前言
现实业务当中,有一个很常见的流程:从数据库获取数据到DataTable,然后将DataTable绑定到实体类集合上,一般是List<Class>,代码写起来也简单:遍历+赋值就可以了。
但是,代码逻辑虽然简单,代码量不小,而且代码往往很臃肿。本篇文章就来一步步对这种业务代码进行优化。
本文使用C#进行实现及演示。
相信看完的你,一定会有所收获!
本文地址:https://www.cnblogs.com/lesliexin/p/15307862.html
二,基础写法
就像前言所说,代码逻辑很简单——遍历+赋值,我们来看一下最基础的写法。

看起来还好,但是,DataTable是存在空值情况的,而空值在实际业务中是个很严重的存在,所以我们需要对DataTable中的空值进行判断。改造后的代码如下:

如果没经历过太多业务代码的读者可能觉得这样看起来也还好,这是因为我为了演示,只设计了几个字段,但在实际业务中,往往都是几十个字段,甚至上百个字段,而且字段名也不是就“AAA”这样三个字母,而是十几、二十几个字母;当写出来时,好几页屏幕都是这种代码,别提有多刺激了。
而且,这里演示时所有属性字段都是string类型的,现实中肯定不是这样,会有int,double,Datetime,bool等等类型,那样代码量会“更胜一筹”,这点在下文会讲。
三,第一步优化
看了上面的代码,可以发现,绝大部分代码都是重复的三元判断,所以在实际写代码时,我都是用Excel的下拉复制功能去写的^_^
我们第一步的优化,就是将这个三元判断优化掉,方法是使用扩展方法,在扩展方法里实现三元判断,并返回我们需要的值。
我们新建一静态类,并新建一扩展方法如下:

有了扩展方法后,我们的代码就可以改成下面这样:

立马简洁了好多有不有!
四,第二步优化
就像上面所说的,不可能所有的属性字段都是string类型的,会有int,double,Datetime,bool等等类型,这就涉及到类型转换的问题。加上类型转换后,不管是使用Convert还是TryParse,代码就又会臃肿了起来。

所以,我们要将这些类型转换给优化掉,优化的方式同样是采用扩展方法,将类型转换包含在扩展方法中。

使用了扩展方法后,代码相较之前前简洁了不少。

五,第三步优化
这时候,我们发现了另一个问题,就是扩展方法太多了。
而且,可以预见的是,随着属性类型的增多,肯定要编写对应的扩展方法,比如:StrToInt(),StrToLong()等等。
同时可发现这些类型转换的扩展方法都是一样的逻辑,所以我们这一次就优化类型转换的扩展方法。
我们新建一个泛型扩展方法,以支持将string转换成指定类型。

这样下来,所有类型转换的扩展方法就变成这一个扩展方法,在使用时只需要写上对应的类型即可。

六,第四步优化
这种时候,有小伙伴就要问了,既然都是依次调用这两个扩展方法,那能不是将这两个再合并一下?当然可以!
我们再改造一下扩展方法,将这两步合而为一。

这种时候,赋值的代码就变成成了这样。
一切仿佛发生了改变,一切又仿佛从未改变。

七,第五步优化
一般而言,到第四步时,已经足够优化了,使用起来也足够简单,代码逻辑也清晰,但是,这还不够,因为还要重复的去一行一行的赋值,都是一样写法,就不能优化掉吗?!
所以这一步我们就将这些给优化掉。
这里面涉及到两个重点,一个是获取类里的属性信息,包含属性名和属性类型;一个是获取DataTable中相应的值并转换为相应的类型。
同时,因为存在属性名与列名一样但大小写不同的情况,也需要进行判断。

实现了这个扩展方法,赋值部分的代码就可以简化成一行代码。

很惊艳是不是?原来要写很多行的代码,现在一行就搞定了,很舒服有不有!
八,第六步优化
什么?还要优化?还能优化?当然可以!
上面的优化只能针对属性名与列名一致的情况,当属性名与列名不一致时,怎么办?
而这,就是我们这一步优化的目标。
为了解决属性名与列名不一致的问题,我们需要用到特性标签,我们新建一个特性类,里面包含一个属性,用来指定属性名所对应的列名。

同时,我们改造下上一步的扩展方法ToList<T>,增加对特性标签的获取与判断。

使用时,在实体类上添加上特性标签即可,比如类的属性“AAA”要取DataTable中列“FFF”对应的值,则在属性“AAA”上加上特性标签“[DT("FFF")]”,其它不需要作任何改变。

九,结束语
至此,经过六步的优化,“从数据库获取数据到DataTable,然后绑定到List<Class>”这一流程的业务代码已经优化完毕,使用时只需要一行代码即可达到目标。
当然,现实中的业务流程肯定千奇百怪,复杂性也不尽相同。本篇文章只是提供一个优化业务代码的思路,以及在特定情况下,可以直接套用本文代码,以节省开发时间,提高开发效率。
感谢阅读,欢迎大家评论指正!
(原创)一步步优化业务代码之——从数据库获取DataTable并绑定到List<Class>的更多相关文章
- Tomcat启动时加载数据到缓存---web.xml中listener加载顺序(例如顺序:1、初始化spring容器,2、初始化线程池,3、加载业务代码,将数据库中数据加载到内存中)
最近公司要做功能迁移,原来的后台使用的Netty,现在要迁移到在uap上,也就是说所有后台的代码不能通过netty写的加载顺序加载了. 问题就来了,怎样让迁移到tomcat的代码按照原来的加载顺序进行 ...
- Loadrunner脚本优化-参数化之关联MySQL数据库获取数据
脚本优化-参数化之关联MySQL数据库获取数据 by:授客 QQ:1033553122 测试环境: Loadrunner 11 Win7 64位 实操: 1. 安装MySQL ODBC驱动程序 O ...
- 从零到千万用户,我是如何一步步优化MySQL数据库的?
写在前面 很多小伙伴留言说让我写一些工作过程中的真实案例,写些啥呢?想来想去,写一篇我在以前公司从零开始到用户超千万的数据库架构升级演变的过程吧. 本文记录了我之前初到一家创业公司,从零开始到用户超千 ...
- JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码
本文是<JVM 性能调优实战之:一次系统性能瓶颈的寻找过程> 的后续篇,该篇介绍了如何使用 JDK 自身提供的工具进行 JVM 调优将 TPS 由 2.5 提升到 20 (提升了 7 倍) ...
- 朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的10种坑
我承认,本文的标题有一点标题党,特别是写业务代码,大家因为没有足够重视一些细节最容易调的坑(侧重Java,当然,本文说的这些点很多是不限制于语言的). 1.客户端的使用 我们在使用Redis.Elas ...
- 使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码 (jvm性能调优)
技术交流群:233513714 本文是<JVM 性能调优实战之:一次系统性能瓶颈的寻找过程> 的后续篇,该篇介绍了如何使用 JDK 自身提供的工具进行 JVM 调优将 TPS 由 2.5 ...
- 从spring源码汲取营养:模仿spring事件发布机制,解耦业务代码
前言 最近在项目中做了一项优化,对业务代码进行解耦.我们部门做的是警用系统,通俗的说,可理解为110报警.一条警情,会先后经过接警员.处警调度员.一线警员,警情是需要记录每一步的日志,是要可追溯的,比 ...
- PostgreSQL 优化器代码概览
简介 PostgreSQL 的开发源自上世纪80年代,它最初是 Michael Stonebraker 等人在美国国防部支持下创建的POSTGRE项目.上世纪末,Andrew Yu 等人在它上面搭建了 ...
- vue+.netcore可支持业务代码扩展的开发框架 VOL.Vue 2.0版本发布
框架介绍 这是一个基于vue.element-ui.iview..netcore3.1 可支持前端.后台动态扩展业务代码快速开发框架. 框架内置定制开发的代码生成器,生成的代码不需要复制也不需要更改, ...
随机推荐
- 设计模式:单例模式的使用和实现(JAVA)
单例模式的使用 jdk和Spring都有实现单例模式,这里举的例子是JDK中Runtime这个类 Runtime的使用 通过Runtime类可以获取JVM堆内存的信息,还可以调用它的方法进行GC. p ...
- IDEA永久使用!!(很全)
IDEA虽然好用,但是下载后只能试用30天,烦恼呀!所以今天就带来IDEA的激活版来帮助大家摆脱30天的苦恼! 准备工作: 破解所需要的软件和jar都在网盘里,需要的自行下载,在这里idea安装就不带 ...
- Python中用max()筛选出列表中出现次数最多的元素
1 List = [1,2,3,4,2,3,2] # 随意创建一个只有数字的列表 2 maxTimes = max(List,key=List.count) # maxTimes指列表中出现次数最多的 ...
- NOIP 模拟 $30\; \rm 毛一琛$
题解 \(by\;zj\varphi\) 如何判断一个集合可以被拆成两个相等的部分? 枚举两个集合,如果它们的和相等,那么他们的并集就是合法的,复杂度 \(\mathcal O\rm(3^n)\) \ ...
- C# 获得文件的执行路径的方法
var path = System.Reflection.Assembly.GetEntryAssembly().Location;
- WPF 显示3D密集场景,堆场管理系统
又好久好久没写博客了,这次接着上文https://www.cnblogs.com/CSSZBB/p/12785380.html,上文用WPF 的绘图功能,制作了一个伪3D的2.5D控件ThreeDBo ...
- WPF Tree多级绑定
<Window x:Class="TreeTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/20 ...
- Spring整合Quartz分布式定时任务
概述虽然单个Quartz实例能给予你很好的Job调度能力,但它不能满足典型的企业需求,如可伸缩性.高可靠性满足.假如你需要故障转移的能力并能运行日益增多的 Job,Quartz集群势必成为你应用的一部 ...
- Mybatis中多表联查,查询出来的字段出现重名,造成数据异常的解决方法!
在做一对多出现的问题,引发的思考:当数据库表中,主表的主键id和明细表的中的字段名相同时怎么办?Mybatis进行自动映射赋值的时候会不会出现异常? 注意:M ...
- Linux操作系统基本应用(完结)
时间:2015-4-10 12:40Linux第一天 Linux基本命令 Linux各文件夹的作用 bin 二进制可执行命令 dev 设备特殊文件 etc 系统管理和配置 ...