在项目过程中有一个这样的需求,对于“所在地”下拉列表中的选项进行勾选,然后在表中对于属于响应所在地的记录进行筛选。如图:
旧思路:做机房的时候,遇到这样的问题,我的思路会是将“所在地”传到一个参数中,然后通过参数到数据库中进行查询,之后刷新界面将查询结果显示出来。
这样做符合正常的设计逻辑,新敲一条查询的线,做起来也容易实现。但是每勾选一次下拉框就会重新对数据库进行一次访问,如果数据量比较大的话,无疑对系统的性能有一定的影响。
新思路:参考了小玉姑娘的代码,一个设计原则:“一次数据库I/O操作,多次对ViewModel进行筛选(代码是MVC+EF)”,即在加载界面过程中将所有“开发区”信息存到一个静态变量当中(生命周期要长),之后随用随取。
这种新的设计好处在于对于数据库的访问次数减少,直接从程序中取数据速度更快,但是会在Controller中写一些逻辑,对于Cline端的性能要求要高,但是却比旧思路高效很多。
对比:结合一个生活的例子:“做排骨,正常情况下我们会去菜市场买上排骨、调料、锅碗瓢盆然后做饭,这就是一次I/O操作的例子,而先去菜市场买排骨回家后再去买调料回家后再去买锅碗瓢盆,这就是多次I/O操作”,性能上更笨不需要数据来说明问题。
HTML页面:
<input id="CityType" class="easyui-combobox" name="CityType" data-options="onSelect:function(){ SelectCityType(); },valueField:'id',textField:'text',url:'/CityBasicInfo/queryType'" value="全部">
//类别查询 function SelectCityType() { //获取类别 var CityType = $('#CityType').combobox('getText'); $('#dg').datagrid({ url: '/CityBasicInfo/SelectCityByType?CityType=' + CityType }); //刷新表格 $("#dg").datagrid("reload"); }
//定义全局变量 public static List<CityBasicInfoViewModel> tempCityBasic = new List<CityBasicInfoViewModel>(); //加载所有的信息 tempCityBasic = ICityBasic.LoadCityBasicInfoByPage(pageSize, pageIndex, out total); #region SelectCityType 县市区按照类别加载表格 - 张振华 2016年4月20日16:08:08 public ActionResult SelectCityByType() { string Type = Request["CityType"].ToString(); if (Type == "全部") { return Json(tempCityBasic, JsonRequestBehavior.AllowGet); } else { //仅仅从tempCityBasic中取出需要的字段显示在datagrid表格当中 List<CityBasicInfoViewModel> cityBasicInfo = tempCityBasic.Where(p => p.DictionaryName == Type).ToList(); return Json(cityBasicInfo, JsonRequestBehavior.AllowGet); } } #endregion
List<CityBasicInfoViewModel> cityBasicInfo = tempCityBasic.Where(p => p.DictionaryName == Type).ToList();
对于静态变量tempCityBasic的再次筛选,即实现不调用Server端就成功地实现了对DataGrid的筛选操作。
【Summary】
对于数据库的I/O访问操作,实现一次访问多次使用是最近的一些感受,在D层所写的查询操作,把查询条件放到最松,以后的数据筛选则基于这一次I/O操作,这是一种值得学习的容器思想。