简易的小企业网站建设,湖南建设门户网站,dm广告设计图片,外地公司做的网站能备案吗背景长话短说#xff0c; 作为开发人员经常需要根据条件灵活查询数据库#xff0c;不管你是用rawsql 还是EFCore#xff0c; 以下类似伪代码大家都可能遇到#xff1a;特别是在大数据产品或者物联网产品中#xff0c;字段甚多#xff1b;if/else 写到死#xff0c;一边写… 背景 长话短说 作为开发人员经常需要根据条件灵活查询数据库不管你是用rawsql 还是EFCore 以下类似伪代码大家都可能遇到 特别是在大数据产品或者物联网产品中字段甚多if/else 写到死一边写一边吐。 写出优雅漂亮的代码从移除if/else 开始。头脑风暴 从灵活查询的要求看每一个字段都有为null 或 不为null 的可能 以上伪代码6个字段 理论上最终执行查询时形成的sql 共有2^6 64种可能。现在我们要写这么多if 语法是因为 - 在编码阶段强制判断字段存在 并据此组装 rawsql - 在编码阶段强制判断字段存在并据此使用lambda强类型 构造IQueryable为了解决这个痛点 引入动态Linq动态Linq的不同之处在于 查询方法的参数不限于强类型的lamdba表达式而是可以使用字符串;使用字符串意味着我们可在运行时动态决定查询内容 同时由于我们在服务端可完全抓取QueryString可一次性组装动态Linq字符串 故动态灵活构建查询的方案呼之欲出。编码实践以上面伪代码业务举例 根据条件灵活查询。1. nuget引入DynamicLinqInstall-Package Microsoft.EntityFrameworkCore.DynamicLinq -Version 1.0.192. 定义EFCore 查询实体类3. Query集合抓取所有QueryString列举字段的方式 判断字段为null 并构造查询 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] NFT_Version_3.2) AND ([c].[car_id] NCD292FE0900X)) AND ([c].[user_id] Nu_1960988792x)) AND ([c].[so_version] Nso_ver1.2)) AND ([c].[config_version] Ncv_1.2)ok That‘s all 移除恶心的 if、else之后代码是不是看起来更优雅一些。总结以上场景相信很多开发者都会遇到特别是进阶到一定水平移除if/else 的欲望愈加强烈。再次强化本文 知识点 DynamicLinq 具备动态形成查询条件的能力不再依靠lambda 强类型表达式而是根据构造的查询字符串内部解析成查询条件。--------------------2019/9/23 下班前更新--------------------------------------DynamicLinq 若动态组装String确实存在 SQL注入问题 使用placeholder 可避免。更新代码 原文链接https://www.cnblogs.com/JulianHuang/p/11567322.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com