我们在做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的参数类:

  1. public class DatagridParameters {
  2. public int Page { get; set; }
  3. public int Rows { get; set; }
  4. public string Sort { get; set; }
  5. public string Order { get; set; }
  6. }

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

  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. };

然后,我们要访问数据:

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

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

  1. public class DatagridParameters {
  2. public int Page { get; set; }
  3. public int Rows { get; set; }
  4. public string Sort { get; set; }
  5. public string Order { get; set; }
  6. /// <summary>
  7. /// 执行分页操作
  8. /// </summary>
  9. /// <typeparam name="T"></typeparam>
  10. /// <param name="source"></param>
  11. /// <returns></returns>
  12. public IQueryable<T> ExecutePaging<T>(IQueryable<T> source) {
  13. if (string.IsNullOrWhiteSpace(Sort)) return source;
  14. if (string.IsNullOrWhiteSpace(Order)) Order = "asc";
  15. try {
  16. Type type = typeof(T);
  17. string methodName = "asc".Equals(Order, StringComparison.OrdinalIgnoreCase) ? "OrderBy" : "OrderByDescending";
  18. PropertyInfo property = type.GetProperty(Sort);
  19. ParameterExpression parameter = Expression.Parameter(type, "c");
  20. MemberExpression propertyAccess = Expression.MakeMemberAccess(parameter, property);
  21. LambdaExpression orderByExp = Expression.Lambda(propertyAccess, parameter);
  22. MethodCallExpression resultExp = Expression.Call(typeof(Queryable), methodName, new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));
  23. source = source.Provider.CreateQuery<T>(resultExp);
  24. } catch {}
  25. return source.Skip((Page - 1) * Rows).Take(Rows);
  26. }
  27. }

解决EasyUI-Datagrid和LinqToEntity结合应用时排序问题的更多相关文章

  1. 解决easyui datagrid加载数据时,checkbox列没有根据checkbox的值来确定是否选中

    背景:   昨天帮朋友做一个easyui datagrid的小实例时,才发现easyui datagrid的checkbox列,没有根据值为true或false来选中checkbox,当时感觉太让人失 ...

  2. 解决easyui datagrid load时缓存问题

    修改easyui datagrid内容保存后,使用$("#dg").datagrid("reload");或者$("#dg").datagr ...

  3. easyui datagrid 异步加载数据时滚动条有时会自动滚到最底部的问题

    在使用easyui 的datagrid异步加载数据时发现滚动条有时会自动滚到最底部.经测试发现,如果加载数据前没有选中行则不会出现这个问题.这样我们可以在重新异步加载数据前取消选中行就可以避免这个问题 ...

  4. EasyUI datagrid默认勾选checkbox时注意事项

    在使用easyui的datagrid默认选中复选框时遇到的一个问题:就是加载程序默认选中复选框时死活选不中,查了好多资料才知道是easyui的datagrid的singleSelect属性设置为‘tr ...

  5. 解决EasyUI DataGrid删除行失败的方法

    笔者最近在做一个项目的后台,用到了EasyUI的datagrid控件,并开启了行内编辑功能,实际上也就是使用了edatagird这个空间,引用了edatagrid.js,一切似乎都做的顺风顺水,添加数 ...

  6. 实现easyui datagrid在没有数据时显示相关提示内容

    本示例实现easyui datagrid加载/查询数据时,如果没有相关记录,则在datagrid中显示没有相关记录的提示信息,效果如下图所示 本实例要实现如下图所示的效果: 本示例easyui版本为1 ...

  7. EasyUI datagrid 日期时间格式化

    EasyUI datagrid中显示日期时间时,会显示为以下不太直观的数值: 添加以下JavaScript脚本,然后在field中添加 formatter: DateTimeFormatter 即可. ...

  8. jquery easyui datagrid 无滚动条,datagrid 没垂直滚动条

    jquery easyui datagrid 无滚动条,datagrid 没垂直滚动条 ============================== 蕃薯耀 2018年2月6日 http://www. ...

  9. easyui datagrid 没数据时显示滚动条的解决方法

    今天解决了一个bug,因为datagrid有多列,可是当没有数据的时候,后面的列无法通过滚动条拉动来显示,比较麻烦,而需求要求没有数据也要拉动滚动条查看后面有什么列,一开始在网上找了一些资料,发现都不 ...

随机推荐

  1. Encode and Decode Strings

    Design an algorithm to encode a list of strings to a string. The encoded string is then sent over th ...

  2. BASH相关

    颜色 http://www.cnblogs.com/lr-ting/archive/2013/02/28/2936792.html http://segmentfault.com/q/10100000 ...

  3. python声明文件编码,必须在文件的第一行或第二行

    #coding=utf-8和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型 注意的两点: 1.声明必须在文件的第一行或第二行: 2.coding后面必须紧跟冒号或等号,#c ...

  4. codeforces A. Table 解题报告

    题目链接:http://codeforces.com/problemset/problem/359/A 题目意思:给出一个n行m列的table,你需要选择一个good cell(假设为(x, y), ...

  5. Js数组里删除指定的元素(不是指定的位置)

    转载自:http://my.oschina.net/zh119893/blog/265964 之前一直是做后端的,从来也没有写过js,但是却一直想学学,也只是基于兴趣而已!现在到了这个公司,确实大量的 ...

  6. ios学习总结(1) -- 创建第一个ios项目

    原文地址 下载并打开xcode. 接着新建一个工程,如下图所示: 点击Create a new Xcode project,之后选择ios下的Application,点击Single View App ...

  7. js判断是否为正整数的正则写法 JavaScript正整数正则

    判断是否为正整数 JavaScript正则判断一串数字是否为正整数, 首先要明白这几个问题 1:javascript里会把一串数字前边的0自动屏蔽,(我不知道屏蔽这个词用的是否正确) console. ...

  8. Car的旅行路线(codevs 1041)

    题目描述 Description 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I ...

  9. ytu 1789:n皇后问题(水题,枚举)

    n皇后问题 Time Limit: 1 Sec  Memory Limit: 64 MB  Special JudgeSubmit: 12  Solved: 3[Submit][Status][Web ...

  10. [译] 在Web Forms 中使用ASP.NET Routing

    本文将以最少的代码想你展示一下的效果: 自定义RUL而不依赖于物理文件名. 使用标记或者代码产生基于route 参数的URL . 如何获得标记或者代码路由过来的参数. 创建Routes void Ap ...