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

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

 
         

要实现这个功能首先必须在界面的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中直接对数据进行排序:

<span style="font-size:18px;">        /// <summary>
        /// 查询数据-->排序
        /// </summary>
        /// <param name="entityName">实体名称</param>
        /// <returns></returns>
        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中的数据进行表头拼接
                //获取sort时,如果sort为空,则默认排序字段为“entityName”,否则为获取到的字段。
                string sort = Request["sort"] == null ? "EntityName" : Convert.ToString(Request["sort"].ToString());
                //string order = Request["order"] == null ? "asc" : Convert.ToString(Request["order"]);
                List<NonQueryPropertiesViewModel> ltAgain = ltProp.OrderBy(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;
            }
            #endregion
        }
        #endregion</span>

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

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

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

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

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

时间: 2024-10-11 11:32:23

委托+拉姆达=自动排序(一)的相关文章

C#基本功------委托和事件(二)--拉姆达表达式

委托的另一种用法---------匿名方法: public delegate void MyDel(string msg);----声明的委托 class Program { static void Main(string[] args) { MyDel mdl = delegate(string str) { Console.WriteLine(str); }; mdl("床前明月光"); Console.ReadKey(); } }另一种简单的写法 public delegate

java 拉姆达 lamdba get

公司老大最近一直推崇拉姆达.自己怀着好奇心学习 Lambda在集合中的使用 列表的遍历 提起对于集合的遍历,恐怕下面的这种方式已经是一种思维定式了吧: final List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); for(int i = 0; i &l

C#高级------拉姆达表达式

namespace out_ref { //声明一个委托 public delegate int Add(int n1,int n2); class Program { //拉姆达表达式 static void Main(string[] args) { Add a = (n1,n2) => n1 - n2; int c = a(10, 5); Console.WriteLine(c); Console.ReadKey(); } } }

拉姆达表达式(Lambda Expressions)

上面两种写法是一样的 ,拉姆达表达式也是一种委托, 但引用的是匿名方法

IOS数组自动排序

self.beacons = [beacons sortedArrayUsingComparator:^NSComparisonResult(BRTBeacon* obj1, BRTBeacon* obj2){ return obj1.distance.floatValue>obj2.distance.floatValue?NSOrderedDescending:NSOrderedAscending; }]; 数组的自动排序: 通过比较的方法进行   排序

使用CollectionViewSource,通过Xaml绑定自动排序

这个是一个完成分组和排序功能的Datagrid,同样只是简单的绑定到List集合,后台不用额外的代码,所有功能都在Xaml中完成: 首先在UI中定义CollectionViewSource资源,在这里定义排序和分组的规则 WPF中定义如下: 引入命名空间:xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase" <Window.Resources> <CollectionViewSourc

DBGrideh 实现自动排序

一.点击标题自动排序 1.在optioneh中设置:AutosortMarking:=True2.设置DbGridEh的属性:(不一定总要设置,与使用的数据连接有关)sortlocal:=True;3.uses 单元Ado------ehlibADoTclientData------ehlibCDSBDE ---------ehlibBDE EhLibUniDAC 4.Column属性 ColumDefValues->Title->TitleButton设为TRUE 二.+序列号

TreeSet实现自动排序的原理

今天随手了一段代码关于通过treeSet实现自动排序的功能,自己折腾了好久. 始终是存在这一些疑惑,后来和同学的交流和调试可以解释自动排序的基本原理: 通过可以通过两种方式实现自动排序: 一种: package xyxysjxy.io; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io

拉姆达表达式

m_pSprite->runAction(CCSequence::create(FadeIn::create(0.4),CallFunc::create([&]{isComplete = true;}),NULL)); 拉姆达表达式,就是一个居部函数,跟居部变量差不多的用法