组织部--不通过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="全部">


        JS文件:

//类别查询function SelectCityType() {    //获取类别    var CityType = $('#CityType').combobox('getText');    $('#dg').datagrid({        url: '/CityBasicInfo/SelectCityByType?CityType=' + CityType    });    //刷新表格    $("#dg").datagrid("reload");}


       Controller文件:

        //定义全局变量        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操作,这是一种值得学习的容器思想。




0 0