如何实现基于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
