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


背景

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

编写优雅代码,从挖掉恶心的if/else 开始_第1张图片

编写优雅代码,从挖掉恶心的if/else 开始_第2张图片


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

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

头脑风暴

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

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

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

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

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

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

编写优雅代码,从挖掉恶心的if/else 开始_第3张图片


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

编码实践

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

1.  nuget引入DynamicLinq:

Install-Package Microsoft.EntityFrameworkCore.DynamicLinq -Version 1.0.19

2. 定义EFCore 查询实体类:

编写优雅代码,从挖掉恶心的if/else 开始_第4张图片


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

编写优雅代码,从挖掉恶心的if/else 开始_第5张图片

 

编写优雅代码,从挖掉恶心的if/else 开始_第6张图片

 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 可避免。

更新代码:

  

编写优雅代码,从挖掉恶心的if/else 开始_第7张图片

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


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


你可能感兴趣的:(编写优雅代码,从挖掉恶心的if/else 开始)