委托+拉姆达=自动排序(一)

来源:互联网 发布:java io分类 编辑:程序博客网 时间:2024/05/21 22:38

         我们总能看到和使用到根据字段排序的功能,也就是文件资源管理器中的点击自动排序的效果:

                                                      

        要实现这个功能首先必须在界面的html代码中进行如下设置:

        

         即:为要排序的字段设置:sortable属性,也就是将该字段设置为可排序。

        既然是界面的排序,就必须存在一个参数,向后台调取相应的方法返回数据到界面,那么方法有二:

       1.将要排序的字段作为参数,层层传递,到后台调取方法:  

<span style="font-size:18px;">   //获取sort时,如果sort为空,则默认排序字段为“entityName”,否则为获取到的字段。   string sort = Request["sort"] == null ? "EntityName" : Convert.ToString(Request["sort"].ToString());   //order同理:默认的排序方式为升序   string order = Request["order"] == null ? "asc" : Convert.ToString(Request["order"]);</span>
       将两个参数层层传递,最后使用底层的LoadpageItems方法:

    //pageSize:每页显示的数据条数; pageIndex:页码

    //total:总数量

   // wherelamdba:查询条件(拉姆达表达式的形式)

   //orderbyLambda:排序条件

   //isAsc :是否为升序

<span style="font-size:18px;">     IQueryable<T> LoadPageItems<Tkey>(int pageSize, int pageIndex, out int total, Expression<Func<T, bool>> whereLambda, Func<T, Tkey> orderbyLambda, bool isAsc);</span>
       其中的whereLamda:说简单了就是一个带有order  by 的sql语句;所有需要的参数和条件都具备之后,就可以有目的的查询到数据库中的数据,最后将数据一层层的返回到界面层,呈现给用户。

       2.在查询到所有数据之后,未显示到界面之前,也就是在controller中直接对获取好的数据进行排序:

     public JsonResult QueryData(string strCondition)        {            //页面的条数            int pageSize = Int32.Parse(Request.Params["rows"].ToString());            //要加载的页数,第几页            int pageIndex = Int32.Parse(Request.Params["page"].ToString());            int total = 0;            #region 根据查询条件,进行查询            try            {                List<NonQueryPropertiesViewModel> ltProp = nonQueryPropertiesServiceWCF.GetAllNonQueryProperties(pageSize, pageIndex, out total, strCondition);                //实例化另外一个对象,承载对ltProp.orderBy 的集合,                //然后再对ltAgain中的数据进行表头拼接                string sort = Request["sort"] == null ? "EntityName" : Convert.ToString(Request["sort"].ToString());                string order = Request["order"] == null ? "asc" : Convert.ToString(Request["order"]);                List<NonQueryPropertiesViewModel> ltAgain = new List<NonQueryPropertiesViewModel>();                if (order == "asc")                {                     ltAgain = ltProp.OrderBy(u => u.GetType().GetProperty(sort).GetValue(u, null)).ToList();                }                else                {                    ltAgain = ltProp.OrderByDescending(u => u.GetType().GetProperty(sort).GetValue(u, null)).ToList();                }                                // 集合重新整合,拼接表格标题                                        var ltPropView = ltAgain.Select(                p => new                {                    p.NonQueryId,                    p.EntityName,                    p.EntityDesc,                    p.PropertyName,                    p.PropertyDesc,                    p.Controls.ControlId,                    p.Controls.ControlDesc,                    p.ControlHtmlId,                    p.PropertyOrder,                    p.ControlHtmlName,                    p.IsShow,                    p.IsNecessary                }                ).ToList();                // 转换成JSON,传递给easyui-datagrid                //拼接JSon格式                //定义返回值                                   var strjson = new                {                    total,                    rows = ltPropView                };                return Json(strjson, JsonRequestBehavior.AllowGet);            }            catch (Exception e)            {                throw e;            }

     使用这种方法,我们直接借用泛型集合的order By 和OrderBy属性,根据排序条件和排序的方式对数据进行排序,然后将排好的数据也就是LtAgain 中的数据赋给界面,这样界面第一次加载时,显示的就是以EntityName为默认排序字段的数据。当点击其他字段,数据会实现相应的操作。

        虽然我们有两种选择,但编程上向来讲究效率,也就是程序反应的敏锐度。那么我们来分析上面两种方法:

      第一种方法最容易想到,但在合作开发中必须底层有LoadpageItems的方法,另外,每次单击不同的字段进行排序,整个获取数据的过程都要重新执行,不仅仅浪费了空间,也降低了程序的执行效率。

      第二种方法在查询数据的基础上进行排序,查询数据的方法得以再次利用,既减少了底层方法的重新开发,也使得每次排序只要在controller中重新排序,而且每次排序只是对界面中显示的条数进行排序,这样一来既提高了效率也节省了程序执行的时间。

     综上所述,开发中不仅仅是对已有知识的运用,更重要的是巧妙地使用已有资源,提高效率。

0 0
原创粉丝点击