组织部--不通过I/O操作来实现信息筛选
来源:互联网 发布:游戏编程团队论坛 编辑:程序博客网 时间:2024/04/26 03:27
【情景再现】
在项目过程中有一个这样的需求,对于“所在地”下拉列表中的选项进行勾选,然后在表中对于属于响应所在地的记录进行筛选。如图:
【设计思路对比】
旧思路:做机房的时候,遇到这样的问题,我的思路会是将“所在地”传到一个参数中,然后通过参数到数据库中进行查询,之后刷新界面将查询结果显示出来。
这样做符合正常的设计逻辑,新敲一条查询的线,做起来也容易实现。但是每勾选一次下拉框就会重新对数据库进行一次访问,如果数据量比较大的话,无疑对系统的性能有一定的影响。
新思路:参考了小玉姑娘的代码,一个设计原则:“一次数据库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操作,这是一种值得学习的容器思想。
- 组织部--不通过I/O操作来实现信息筛选
- 用C++实现文件I/O操作
- 实现异步操作文件I/O
- C++I/O操作
- I/O操作
- I/O操作
- 文件I/O操作
- 文件I/O操作
- 文件I/O操作
- JAVA I/O操作
- java I/O操作
- I/O 文件操作
- 文件I/O操作
- I/O操作
- I/O 文件操作
- C++ I/O操作
- 文件I/O操作
- 文件I/O操作
- Intel HD Graphics
- linux 网络编程基础(四)read,write,connect超时封装
- run loop
- iOS开发--"Library not found for -"错误处理
- 吃货不得不知道的一些英语习语
- 组织部--不通过I/O操作来实现信息筛选
- 第七周项目1(2)
- mysql数据库导入access文件后中文字段显示问号(数据库乱码)
- mongodb 安装
- 全面剖析Smarty缓存机制
- 初学android开发--day08
- git命令整理
- telnet笔记
- eclipse使用教程系列之四:发布部署项目以及常见问题总结