懒汉处理dapper字段名与属性名的映射方式
来源:互联网 发布:php视频网站 编辑:程序博客网 时间:2024/06/05 08:07
你还以为走路是世上最简单的事情呢?只不过是把一只脚放到另一只脚前面。但我一直很惊讶这些原本是本能的事情实际上做起来有多困难。而吃,吃也是一样的,有些人吃起东西来可困难了。说话也是,还有爱。这些东西都可以很难。
--摘自蕾秋·乔伊斯《一个人的朝圣》
如题,项目的持久层用的是dapper,有一些复杂的报表需要自己编写sql。 通过dapper返回一个泛型数据集合。这个泛型类T通常就是我们所定义的一个DTO,如下代码中的ZhifuDuizhangBaobiaoDTO。
开发过程中,数据表字段的命名并不规范,我在开发这个报表时重新定义了一下DTO的属性名。这时,sql里就要用到as了。
public static List<ZhifuDuizhangBaobiaoDTO> GetDuizhangBaobiao(ZhifuDuizhangBaobiaoQueryModel query, PageModel pageModel){ string sql = @"SELECT ZFDate as 'OrderPayDate', OrderNo, orderId, ChannelNo, OrderAmount as 'Amount', orderst as 'OrderStatus', mercodeFROM t_business_airorders aWHERE ZFDate>=@dateFr AND ZFDate<@dateToAND payType>1 "; // 参数值判断 if (null != query.OrderNo && query.OrderNo.Trim() != "") { sql += " AND a.OrderNo=@OrderNo"; query.OrderNo = query.OrderNo.Trim(); } if (null != query.ChannelNo && query.ChannelNo.Trim() != "") { ...... } var dp = new Object(); dp = new { dateFr = query.OrderPayDateFr.Date, dateTo = query.OrderPayDateTo.Date.AddDays(1), OrderNo = query.OrderNo, ChannelNo = query.ChannelNo, }; sql += " order by a.ZFDate desc"; using (var conn = ConnUtility.GateWayConntion) { var pagedList = conn.MySqlPageList<ZhifuDuizhangBaobiaoDTO>(sql, pageIndex: pageModel.PageNo, pageSize: pageModel.PageSize, param: dp); pageModel.RecordCount = pagedList.recordCount; var lst = pagedList.listT; return lst.ToList(); }}
与前端的视图页联调通过后,这样的代码可以fix了。
不过,上面的代码其实是有隐形错误的——当日后重命名ZhifuDuizhangBaobiaoDTO的OrderPayDate、Amount属性时,很容易忽略这段sql文本里的as。
那么,为了能应对日后的扩展和重构,我采用了另一种方式,利用linq的Expression表达式来读取属性名。
public static List<ZhifuDuizhangBaobiaoDTO> GetDuizhangBaobiao(ZhifuDuizhangBaobiaoQueryModel query, PageModel pageModel){ string sql = @"SELECT ZFDate as '{0}', OrderNo, orderId, ChannelNo, OrderAmount as '{1}', orderst as '{2}', mercodeFROM t_business_airorders aWHERE ZFDate>=@dateFr AND ZFDate<@dateToAND payType>1 "; sql = string.Format(sql, GetPropertyName<ZhifuDuizhangBaobiaoDTO>(c => c.OrderPayDate), GetPropertyName<ZhifuDuizhangBaobiaoDTO>(c => c.Amount), GetPropertyName<ZhifuDuizhangBaobiaoDTO>(c => c.OrderStatus)); ......}
这里借助了一个GetPropertyName<T>方法。
public static string GetPropertyName<T>(Expression<Func<T, object>> expr){ var rtn = ""; if (expr.Body is UnaryExpression) { rtn = ((MemberExpression)((UnaryExpression)expr.Body).Operand).Member.Name; } else if (expr.Body is MemberExpression) { rtn = ((MemberExpression)expr.Body).Member.Name; } else if (expr.Body is ParameterExpression) { rtn = ((ParameterExpression)expr.Body).Type.Name; } return rtn;}
墨菲定律里有说“会出错的事总会出错”。一个在开发中的项目,经常因review或代码分析而改一些代码的。这样就一劳永逸了。日后重构属性名,我们就不用担心这块了。
BTW,在MVC视图页里,我们要显示模型的显示名称,经常这样写@Html.DisplayNameFor(model => model.OrderPayDate),当属性没有DisplayNameAttribute时,就会返回属性名。
今天突然想到了“懒汉”这个词,是为了纪念一位在公司待过一段时间的老产品经理,周缘昕。我们公司的企业用车产品能够在企业出行市场占据一席之地,少不了他的倾心贡献。NB之大,百度一下,你就知道。曾参加他给产品部门的一个培训,其中谈到了产品设计的“懒汉思维”。一个产品经理把一个需求设计合理并讲清楚,并不是一件容易的事情。同样,后期的运营跟进同样不是易事。 之于系统开发方面,又何尝不是呢。在我去年的文章《运维一个应用系统不容易(2016-07-29 18:43)》里有一些唠叨。
- 懒汉处理dapper字段名与属性名的映射方式
- 懒汉处理dapper字段名与属性名的映射方式
- 懒汉处理dapper字段名与属性名的映射方式
- 第四讲 属性名和字段名不一致的处理
- hibernate:映射文件的属性名必须和pojo类的属性名以及数据库字段名一一对应
- 在Mybatis中,解决数据库字段名与java实体类属性名不一致的三种方式
- 使用MyBatis的默认(数据库字段和属性名忽略大小匹配)映射方式,必须有无惨构造函数。
- hibernate 映射文件 当表名或字段名与数据库关键字冲突的解决办法
- Gson解析之字段名和实体类属性名不一致的处理
- Mybatis解决属性名与字段名不一致
- Mybatis解决属性名与字段名不一致
- Mybatis解决属性名与字段名不一致
- [学习小结]Mybaits的解决字段名与实体类属性名不相同的冲突
- mybatis-解决字段名与实体类属性名不相同的冲突
- MyBatis——解决字段名与实体类属性名不相同的冲突
- MyBatis中解决字段名与实体类属性名不相同的冲突
- MyBatis解决字段名与实体类属性名不相同的冲突
- 解决字段名与实体类属性名不相同的冲突
- 消失的postmaster进程
- 论文笔记:Recurrent Models of Visual Attention
- Spark配置参数中英文对照
- java 中 map.get(key) 的类型转换
- AngularJS的学习--$on、$emit和$broadcast的使用
- 懒汉处理dapper字段名与属性名的映射方式
- 树链剖分
- CRichEditCtrl使用CHARFORMAT这个结构设置字体,颜色,字号
- Linux下用GDB调试多线程程序
- gemotion安装apk出现的INSTALL_FAILED_NO_MATCHING_ABIS错误解决方法
- mac 彻底卸载 node
- 一个三年以上老项目加入React Native 模块的过程
- 腾讯云服务器部署JavaWeb项目
- 03.Java 关键字