编写优雅代码,从挖掉恶心的if/else 开始


背景

  长话短说, 作为开发人员经常需要根据条件灵活查询数据库,不管你是用rawsql 还是EFCore, 以下类似伪代码大家都可能遇到:

640?wx_fmt=png

640?wx_fmt=png


   特别是在大数据产品或者物联网产品中,字段甚多;if/else 写到死,一边写一边吐。

   写出优雅漂亮的代码,从移除if/else 开始。

头脑风暴

  从灵活查询的要求看,每一个字段都有为null 或 不为null 的可能, 以上伪代码6个字段, 理论上最终执行查询时形成的sql 共有2^6= 64种可能。

现在我们要写这么多if 语法,是因为:

  -  在编码阶段,强制判断字段存在, 并据此组装 rawsql

  -  在编码阶段,强制判断字段存在,并据此使用lambda强类型 构造IQueryable

为了解决这个痛点, 引入动态Linq,动态Linq的不同之处在于 查询方法的参数不限于强类型的lamdba表达式,而是可以使用字符串;

使用字符串,意味着我们可在运行时动态决定查询内容

 
 

640?wx_fmt=png


  同时由于我们在服务端可完全抓取QueryString(可一次性组装动态Linq字符串), 故动态灵活构建查询的方案呼之欲出。

编码实践

以上面伪代码业务举例, 根据条件灵活查询。

1.  nuget引入DynamicLinq:

Install-Package Microsoft.EntityFrameworkCore.DynamicLinq -Version 1.0.19

2. 定义EFCore 查询实体类:

640?wx_fmt=png


3. Query集合抓取所有QueryString,列举字段的方式 判断字段为null, 并构造查询

640?wx_fmt=png

 

640?wx_fmt=png

 EFCore生成的SQL如下:

SELECT [c].[Id], [c].[car_id], [c].[car_version], [c].[config_content], [c].[config_version], [c].[so_version], [c].[user_id]
FROM [car_energy_model] AS [c]
WHERE (((([c].[car_version] = N'FT_Version_3.2') AND ([c].[car_id] = N'CD292FE0900X')) AND ([c].[user_id] = N'u_1960988792x')) AND ([c].[so_version] = N'so_ver1.2')) AND ([c].[config_version] = N'cv_1.2')

ok, That‘s all 

移除恶心的 if、else之后代码是不是看起来更优雅一些。

总结

以上场景相信很多开发者都会遇到,特别是进阶到一定水平,移除if/else  的欲望愈加强烈。

再次强化本文 知识点:   

  DynamicLinq 具备动态形成查询条件的能力,不再依靠lambda 强类型表达式,而是根据构造的查询字符串,内部解析成查询条件。

--------------------2019/9/23 下班前更新--------------------------------------

DynamicLinq  若动态组装String,确实存在 SQL注入问题, 使用placeholder 可避免。

更新代码:

  

640?wx_fmt=png

原文链接:https://www.cnblogs.com/JulianHuang/p/11567322.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值