本章我们主要讲解如何实现一个复杂的查询。由于目前TinyFrame框架已经投入到了实际的项目生产中,所以我很乐意将项目中遇到的任何问题做以记录并备忘。
这章中,我们提到的查询界面如下所示:
其中,涉及到联查,单查;对于联查部分,选中”所属区域“后,才会加载”所属基地“内容,选中”所属基地“后,才会加载”所属设备“内容,选中”所属设备“后才会加载”检索参数“内容。其他的项会在页面加载的时候就被填充了。由于复杂的查询要涉及很多表的联查,所以不可能做成通用的,所以在这里,利用代码生成器来生成复杂的查询操作是最靠谱的。这是后话,我们今天主要来看看利用TinyFrame框架如何来实现复杂的查询功能:
首先,我们定义一个查询接口:
然后,下面是其实现部分:
第48~55行,主要是获取数据对象操作。由于TinyFrame提供了丰富的数据对象获取行为,所以这里想拿什么对象,就拿什么对象。
第60行及其以后的行,主要是用来判断当前查询中有无值,如果有值,就进行过滤,如果没有值就不进行任何操作。由于Repository中的GetMany方法支持Linq操作,所以这里做过滤的时候,感觉非常轻松,同时由于EF的导航属性,使用起来就更加便捷了。
第114行主要是用来检测参数的,如果用户未选择任何项进行过滤,则默认加载全部数据。
第119行主要是用来定义缓存的Key 。
第120行主要是用来获取数据并返回,如果在Cache中存在数据,则直接命中返回;反之,则从数据库获取后,保存到缓存中,然后返回给前台页面。
最后,在Controller中,我们的调用就简单的多:
上面代码中:
第32行,主要是调用我们的方法来返回查询的结果集。
第39行,主要是将当前的实体类进行一下重组,以便于满足前台页面的显示。
第57行,主要是用来构造JSON字串。
第62行及其之后,返回JsonResult到前台。
这样做完之后,Controller就已经把实体类都准备好了,下面部分就是进行前台组织调用了:
第53行,主要用来动态加载”所属区域“下拉列表。
第65行,主要用来根据所选的”所属区域“值,来动态加载”所属基地“下拉列表。
第77行,主要用来加载”设备类型”下拉列表。
第87行,主要用来根据所选的“所属基地”值,来动态加载“所属设备”下拉列表。
第99行,主要用来根据所选的“所属设备”值,来动态加载“检索参数”下拉列表。
第30行,主要用来提交组合查询,通过将其组合成JSON串返回给Controller进行控制。
需要注意的是,在EasyUI中,如果想让DataGrid的自定义参数返回给Controller,只需要利用
即可实现(注意上边代码中的黄色背景标注部分),在后台只需要通过:
即可获取。
最后看看我们的查询结果:
最后附上下载: