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

原创 2012年03月23日 11:33:39

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

public class DatagridParameters {
	public int Page { get; set; }
	public int Rows { get; set; }
	public string Sort { get; set; }
	public string Order { get; set; }
}

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

//获取参数
DatagridParameters dgParameters = new DatagridParameters {
	Page = Convert.ToInt32(context.Request.Form["page"]),
	Rows = Convert.ToInt32(context.Request.Form["rows"]),
	Sort = context.Request.Form["sort"],
	Order = context.Request.Form["order"],
};

然后,我们要访问数据:

using (SchoolDatabase db = new SchoolDatabase()) {

	UserBO userBO = UserBO.CreateBO<UserBO>();
	IQueryable<UserBO> query = userBO.GetUserList(db);

	JArray jRows = new JArray();
	json.Add(new JProperty("total", query.Count()));
					
	//这里进行排序和分页操作
	query = datagridPara.ExecutePaging(query);
										
	foreach (UserBO bo in query) {
		JObject o = JObject.FromObject(bo);
		jRows.Add(JObject.FromObject(bo));
	}
	json.Add(new JProperty("rows", jRows));
}

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

public class DatagridParameters {
	public int Page { get; set; }
	public int Rows { get; set; }
	public string Sort { get; set; }
	public string Order { get; set; }

	/// <summary>
	/// 执行分页操作
	/// </summary>
	/// <typeparam name="T"></typeparam>
	/// <param name="source"></param>
	/// <returns></returns>
	public IQueryable<T> ExecutePaging<T>(IQueryable<T> source) {

		if (string.IsNullOrWhiteSpace(Sort)) return source;
		if (string.IsNullOrWhiteSpace(Order)) Order = "asc";

		try {
			Type type = typeof(T);
			string methodName = "asc".Equals(Order, StringComparison.OrdinalIgnoreCase) ? "OrderBy" : "OrderByDescending";
			PropertyInfo property = type.GetProperty(Sort);
			ParameterExpression parameter = Expression.Parameter(type, "c");
			MemberExpression propertyAccess = Expression.MakeMemberAccess(parameter, property);
			LambdaExpression orderByExp = Expression.Lambda(propertyAccess, parameter);
			MethodCallExpression resultExp = Expression.Call(typeof(Queryable), methodName, new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));
			source = source.Provider.CreateQuery<T>(resultExp);
		} catch {}
		return source.Skip((Page - 1) * Rows).Take(Rows);
	}
}






JObject 排序操作

JObject joeme = JObject.Parse(stringss);  JObject josort = new JObject{new JProperty("StudyProgress...
  • jurken
  • jurken
  • 2015年05月08日 17:13
  • 1267

C# JSON按key进行排序

JSON按key进行排序

.Net 中的反射(查看基本类型信息)

反射概述 和Type类 1.反射的作用 简单来说,反射提供这样几个能力:1、查看和遍历类型(及其成员)的基本信息和程序集元数据(metadata);2、迟绑定(Late-Binding)方法和属性。3...

将 键值对的数据 拼成 json 格式的 串

https://developer.mozilla.org/zh-cn/Using_native_JSON json键值对逆置 在某些特殊场景需要将JSON的键值对倒置(Inverti...
  • zzhays
  • zzhays
  • 2012年07月19日 00:33
  • 11515

jquery easyui datagrid请求两次或多次的问题解决方法

jquery easyui datagrid请求两次或多次的问题解决方法

解决:easyui中的datagrid详情展开,combobox的级联操作,以及修复combobox总是显示value值的问题

先来看下效果 var comboboxData;//项目与部门 field内的combobox data var datagrid; $(function() { //输入url获得d...

第三方控件获取值问题的解决(附转载的easyUI datagrid 时间格式化(两种))

在.net开发过程中,经常会有使用第三方控件的情况,但是在使用过程中,却有时候会获取不到使用控件的值。 也会有easyui datagrid时间格式错乱的问题,以下提供两种不同时间格式的解决方案...

easyui datagrid 添加操作列时设计到rowdata传参问题

在使用datagrid时,经常需要添加一列操作,里面可以有一些例如详情,删除,修改之类的超链接,这样就用到datagrid的格式化属性,如下代码所示 操作 function showDetailBtn...
  • zjsdrs
  • zjsdrs
  • 2017年10月30日 19:48
  • 46

jquery-easyui的datagrid在checkbox多选时,行选中不对应,去除高亮的解决方法

jquery-easyui的datagrid在checkbox多选时,行选中不对应,去除高亮的解决方法 checkOnSelect:false,     onSelect:function(rowIn...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:解决EasyUI-Datagrid和LinqToEntity结合应用时排序问题
举报原因:
原因补充:

(最多只允许输入30个字)