• 解决EasyUI-Datagrid和LinqToEntity结合应用时排序问题


    我们在做WEB页面时,时常会选择JQuery框架的Datagrid,如Ext、EasyUI、Flexigrid,数据访问则采用LinqToSQL或LinqToEntity。UI用Jquery框架的目的是代码简洁,较好的用户体验,漂亮的CSS;数据访问采用LinqToSQL或LinqToEntity的优点是开发便捷,将大部分的时间投入到业务中,而不是Ado.net的数据操作上。

    下图是UI和后台的交互简略图,UI将json发送到业务层,业务层将json数据包装成查询对象,然后进行数据访问,获取数据结果集后,再包装成json对象返回给UI,然后UI解析和展现。

    这里我就以EasyUI的Datagrid和LinqToEntity为例。见效果图:

    难点是当需要排序时,LinqToEntity是通过对象的属性指定排序字段,而UI传过来的是字段名,要将排序的字符串转换为Lambda的排序。
    分析EasyUI的Datagrid在ajax操作时传递了4个参数,分别是:Page(第几页),Rows(每页记录数),Sort(排序的字段名),Order(排序方式),为此我构建了Datagrid的参数类:

    [csharp] view plaincopy
     
    1. public class DatagridParameters {  
    2.     public int Page { getset; }  
    3.     public int Rows { getset; }  
    4.     public string Sort { getset; }  
    5.     public string Order { getset; }  
    6. }  

    参数的包装我是通过一般处理程序来处理,也可以是WCF或其他,哪里处理不是本文的重要之处

    [csharp] view plaincopy
     
    1. //获取参数  
    2. DatagridParameters dgParameters = new DatagridParameters {  
    3.     Page = Convert.ToInt32(context.Request.Form["page"]),  
    4.     Rows = Convert.ToInt32(context.Request.Form["rows"]),  
    5.     Sort = context.Request.Form["sort"],  
    6.     Order = context.Request.Form["order"],  
    7. };  

    然后,我们要访问数据:

    [csharp] view plaincopy
     
    1. using (SchoolDatabase db = new SchoolDatabase()) {  
    2.   
    3.     UserBO userBO = UserBO.CreateBO<UserBO>();  
    4.     IQueryable<UserBO> query = userBO.GetUserList(db);  
    5.   
    6.     JArray jRows = new JArray();  
    7.     json.Add(new JProperty("total", query.Count()));  
    8.                       
    9.     //这里进行排序和分页操作  
    10.     query = datagridPara.ExecutePaging(query);  
    11.                                           
    12.     foreach (UserBO bo in query) {  
    13.         JObject o = JObject.FromObject(bo);  
    14.         jRows.Add(JObject.FromObject(bo));  
    15.     }  
    16.     json.Add(new JProperty("rows", jRows));  
    17. }  

    为了实现Queryable的排序和分页,我在DatagridParameters中增加了一个ExecutePaging方法,该方法用于将排序的字符串转换为Lambda排序,并添加分页功能。

    [csharp] view plaincopy
     
    1. public class DatagridParameters {  
    2.     public int Page { getset; }  
    3.     public int Rows { getset; }  
    4.     public string Sort { getset; }  
    5.     public string Order { getset; }  
    6.   
    7.     /// <summary>  
    8.     /// 执行分页操作  
    9.     /// </summary>  
    10.     /// <typeparam name="T"></typeparam>  
    11.     /// <param name="source"></param>  
    12.     /// <returns></returns>  
    13.     public IQueryable<T> ExecutePaging<T>(IQueryable<T> source) {  
    14.   
    15.         if (string.IsNullOrWhiteSpace(Sort)) return source;  
    16.         if (string.IsNullOrWhiteSpace(Order)) Order = "asc";  
    17.   
    18.         try {  
    19.             Type type = typeof(T);  
    20.             string methodName = "asc".Equals(Order, StringComparison.OrdinalIgnoreCase) ? "OrderBy" : "OrderByDescending";  
    21.             PropertyInfo property = type.GetProperty(Sort);  
    22.             ParameterExpression parameter = Expression.Parameter(type, "c");  
    23.             MemberExpression propertyAccess = Expression.MakeMemberAccess(parameter, property);  
    24.             LambdaExpression orderByExp = Expression.Lambda(propertyAccess, parameter);  
    25.             MethodCallExpression resultExp = Expression.Call(typeof(Queryable), methodName, new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));  
    26.             source = source.Provider.CreateQuery<T>(resultExp);  
    27.         } catch {}  
    28.         return source.Skip((Page - 1) * Rows).Take(Rows);  
    29.     }  
    30. }  
  • 相关阅读:
    获取MySQL各版本yum源 并安装
    CentOS 防火墙实用操作
    简单3步将你的python转成exe格式
    java 实现扑克牌打印
    java 一维数组的总结笔记
    java中如何理解:其他类型 + string 与 自增类型转换和赋值类型转换
    c语言 0与非0
    Python中nonlocal的用法
    Python基础系列讲解-自动控制windows桌面
    flask_caching 缓存
  • 原文地址:https://www.cnblogs.com/hyl8218/p/3333169.html
Copyright © 2020-2023  润新知