如何实现基于DDD的超轻量级快速开发架构中动态Linq查询的优化策略?

摘要:-之动态查询,查询逻辑封装复用 基于领域驱动设计(DDD)超轻量级快速开发架构详细介绍请看 https:www.cnblogs.comneozhup13174234.html 需求 配合EasyUI datagird filter
-之动态查询,查询逻辑封装复用 基于领域驱动设计(DDD)超轻量级快速开发架构详细介绍请看 https://www.cnblogs.com/neozhu/p/13174234.html 需求 配合EasyUI datagird filter实现多字段(任意字段)的筛选 根据业务需求筛选特定的状态或条件,如:查看结案的订单,最近30天的订单,查看属于我的订单.等等,这些逻辑是固定也是可以被重用,但又不想每次写相同的条件,那么下面我会给我的解决方案. 需求1只是一个偷懒的实现方式,因为datagrid自带这个功能,但又不想根据具体的需求来画查询条件,如果需求必须要再datagrid上面做一块查询条件的输入那目前只能在前端自己手工添加,在组织后传入后台,暂时不在这里讨论 需求2可能不太好解释,看完代码就自然理解为什么要这么做了,这么做的好处有哪些 具体实现的方式 默认情况下 datagrid 有几列就可以对这几列进行筛选,对于日期型的字段会采用between,选择2个时间之间进行筛选,数字类型会提供大于小于等符号选择,可以自行尝试,其原理是datagrid 会根据datagrid 头部输入的值生成一个Json字符串发送后台请求数据 JSON:格式 filterRules: [ {field:field,op:op,value:value}, {field:field,op:op,value:value}, ] 通常的做法是一个一个判断加条件 1 var filters = JsonConvert.DeserializeObject<IEnumerable<filterRule>>(filterRules); 2 foreach (var rule in filters) 3 { 4 if (rule.field == "Id" && !string.IsNullOrEmpty(rule.value) && rule.value.IsInt()) 5 { 6 var val = Convert.ToInt32(rule.value); 7 switch (rule.op) 8 { 9 case "equal": 10 this.And(x => x.Id == val); 11 break; 12 case "notequal": 13 this.And(x => x.Id != val); 14 break; 15 case "less": 16 this.And(x => x.Id < val); 17 break; 18 case "lessorequal": 19 this.And(x => x.Id <= val); 20 break; 21 case "greater": 22 this.And(x => x.Id > val); 23 break; 24 case "greaterorequal": 25 this.And(x => x.Id >= val); 26 break; 27 default: 28 this.And(x => x.Id == val); 29 break; 30 } 31 } 32 if (rule.field == "Name" && !string.IsNullOrEmpty(rule.value)) 33 { 34 this.And(x => x.Name
阅读全文