using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
/**
*
* jackchain
* QQ:710782046
* 2017-08-31
* 动态构造OrderBy Linq序列
*
*/ namespace UFX.Tools
{
public class ConvertExtOrderLinq
{
/// <summary>
/// 动态转换为Linq排序
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="orderList">[aaa,bbb,ccc],[asc,asc,desc]</param>
/// <returns></returns>
public static Func<IQueryable<T>, IOrderedQueryable<T>> GetOrderBy<T>(List<string> orderColumn, List<string> orderDir)
{
string ascKey = "OrderBy";
string descKey = "OrderByDescending"; Type typeQueryable = typeof(IQueryable<T>);
ParameterExpression argQueryable = Expression.Parameter(typeQueryable, "jk");
var outerExpression = Expression.Lambda(argQueryable, argQueryable); for (int i = ; i < orderColumn.Count; i++)
{
string columnName = orderColumn[i];
string dirKey = orderDir[i].ToLower(); IQueryable<T> query = new List<T>().AsQueryable<T>();
Type type = typeof(T);
ParameterExpression arg = Expression.Parameter(type, "uf");
Expression expr = arg; if (columnName.Contains("."))
{
// support to be sorted on child fields.
String[] childProperties = columnName.Split('.');
System.Reflection.PropertyInfo property = typeof(T).GetProperty(childProperties[]);
MemberExpression propertyAccess = Expression.MakeMemberAccess(arg, property); for (int j = ; j < childProperties.Length; j++)
{
Type t = property.PropertyType;
if (!t.IsGenericType)
{
property = t.GetProperty(childProperties[j]);
}
else
{
property = t.GetGenericArguments().First().GetProperty(childProperties[i]);
}
type = property.PropertyType;
expr = Expression.MakeMemberAccess(propertyAccess, property);
//propertyAccess = Expression.MakeMemberAccess(propertyAccess, property);
}
//property = type.GetProperty(propertyName);
//propertyAccess = Expression.MakeMemberAccess(parameter, property);
}
else
{
PropertyInfo pi = type.GetProperty(columnName, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
expr = Expression.Property(expr, pi);
type = pi.PropertyType;
} LambdaExpression lambda = Expression.Lambda(expr, arg);
string methodName = dirKey == "asc" ? ascKey : descKey;
MethodCallExpression resultExp = Expression.Call(typeof(Queryable), methodName, new Type[] { typeof(T), type }, outerExpression.Body, Expression.Quote(lambda)); outerExpression = Expression.Lambda(resultExp, argQueryable); ascKey = "ThenBy";
descKey = "ThenByDescending";
}
return (Func<IQueryable<T>, IOrderedQueryable<T>>)outerExpression.Compile();
} }
}

如何使用?

[Action]
[Description("获取Grid数据")]
[HttpPost]
public JsonResult Get(int start, int length, ExtGridSearch condition, ExtGridMutiSearch[] extCdns, ExtGridOrder[] order)
{
int totalCount = ; Func<IQueryable<DB_Color>, IOrderedQueryable<DB_Color>> dyncOrder = ConvertExtOrderLinq.GetOrderBy<DB_Color>(order.Select(s => s.column).ToList(), order.Select(s => s.dir).ToList());
var list = WMFactory.DBColor.FindByPage(start, length, out totalCount,
dyncOrder,
null, condition, extCdns);
return Json(new { data = list, recordsTotal = totalCount, recordsFiltered = totalCount }, JsonRequestBehavior.AllowGet);
}

可结合Datatables 插件一起配合使用

 //主表格
var DBRangeGrid = $('#DBRangeGrid').dataTable(
{
scrollY: Global_MainTableHeight,
scrollX: true,
autoWidth: true,
scrollCollapse: false,
"processing": true,
"serverSide": true,
"ajax": {
"url": "/Admin/Range/Get",
"type": "POST",
"data": function (d) {
var dtCols = $('#DBRangeGrid').DataTable().settings().init().columns;
var extOrder = [];
var dtOrders = $('#DBRangeGrid').DataTable().order();
$.each(dtOrders, function (i, item) {
extOrder.push({ column: dtCols[item[0]].data, dir: item[1] });
})
d.order = extOrder;
d.query = $("#txtSearchKey").val();
d.fields = ['IsEnable', 'Year.YearName', 'Season.SeasonName', 'RangeName', 'Remark', 'CreateUser', ];
}
},
"ordering": true,
"order": [[, "desc"]],
"columns": [
{
"class": "cbcenter",
"orderable": false,
"title": '<input type="checkbox" title="全选" class="selectAll" />',
"data": "Id",
"width": "30px",
"render": function (data, type, row) {
return '<input type="checkbox" class="ckbox" />';
}
},
{
"title": "启用", "data": "IsEnable", render: function (data, tp, row) { if (row.IsEnable == ) {
return "<span style='color:green'>启用</span>";
} else {
return "<span style='color:red'>禁用</span>";
}
}
},
{ "title": "年份", "data": "Year.YearName" },
{ "title": "季节", "data": "Season.SeasonName" },
{ "title": "月份", "data": "Month" },
{ "title": "波段名称", "data": "RangeName" },
{ "title": "备注", "data": "Remark" },
{
"data": "CreateUser", "title": "操作人", "width": "40px", "render": function (data, type, record) {
if (record.ModifyUser != undefined && record.ModifyUser != "" && record.ModifyUser != null) return record.ModifyUser;
else return data;
}
},
{
"data": "CreateTime", "title": "操作时间", "width": "120px", "render": function (data, type, record) {
if (record.ModifyTime != undefined && record.ModifyTime != "" && record.ModifyTime != null) data = record.ModifyTime;
var dt = eval("new " + data.substr(, data.length - ));
return dt.Format("yyyy-MM-dd hh:mm:ss");
}
}
]
});

EntityFramework 动态构造排序 Func<IQueryable<T>, IOrderedQueryable<T>> Dynamic的更多相关文章

  1. 动态构造任意复杂的 Linq Where 表达式

    前言 Linq 是 C# 中一个非常好用的集合处理库,用好了能帮我们简化大量又臭又长的嵌套循环,使处理逻辑清晰可见.EF 查询主要也是依赖 Linq.但是 Linq 相对 sql 也存在一些缺点,最主 ...

  2. Linq to Sql : 动态构造Expression进行动态查询

    原文:Linq to Sql : 动态构造Expression进行动态查询 前一篇在介绍动态查询时,提到一个问题:如何根据用户的输入条件,动态构造这个过滤条件表达式呢?Expression<Fu ...

  3. [2014-12-30]如何动态构造Lambda表达式(动态构造Lambda查询条件表达式)

    声明 本文对Lambda表达式的扩展,示例代码来源于网络. 场景描述 web开发查询功能的时候,如果查询条件比较多,就会遇到动态组合查询条件的情况.在手写sql的情况下,我们一般会根据传入的参数,针对 ...

  4. easyui datagrid remoteSort的实现 Controllers编写动态的Lambda表达式 IQueryable OrderBy扩展

    EF 结合easy-ui datagrid 实现页面端排序 EF动态编写排序Lambda表达式 1.前端页面 var mainListHeight = $(window).height() - 20; ...

  5. Activator 动态构造对象

    Activator  意义: 用于动态构造对象 语法1: 根据指定的泛型类型构造对象 Activator.CreateInstance<类型>() 语法2: 根据程序集和类型名构造对象 S ...

  6. EntityFramework动态组合多排序字段

    前言:在使用EF当中,肯定会遇到动态查询的需求,建立一个公共调用的动态组合表达式查询也是必不可少的,以下是建立动态组合多排序字段做个记录,供以后调用 1.建立一个结构,用于多个排序字段组合,这个结构体 ...

  7. Entity Framework 动态构造Lambda表达式Expression<Func<T, bool>>

    using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; us ...

  8. Linq 动态查询排序

    Linq的排序一般是这样写的: query.OrderBy(x => x.Tel).Skip().Take(); 实际使用中排序字段可能是通过字符类型的参数来设置的,于是想这样实现: query ...

  9. Linq 动态组合排序(Lambda)

    最近有个项目需要做一个排班的功能,需要对排班的数据按不同的规则进行排序:因为排序规则是动态变化的,所以不太适合放到数据库中(临时表)中处理: 所以考虑使用Linq的排序方式(按不同的条件判断条件组合排 ...

随机推荐

  1. 2107 ACM 水题

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2107 题意:比较大小,即使简单还是没有一次过,粗心的我,终于放假了,虽然我平时课还是有点多,但是希望自己能 ...

  2. php5.4以下,json_encode不转义实现方法

    function json_encode($input){ // 从 PHP 5.4.0 起, 增加了这个选项. if(defined('JSON_UNESCAPED_UNICODE')){ retu ...

  3. SpringIOC和DI

    1.Spring的概念 Spring的绿草丛(一) Spring轻量级框架, Java EE的春天,当前主流框架目标使现有技术更加易用,推进编码最佳实践内容IoC容器AOP实现数据访问支持简化JDBC ...

  4. [PA2014]Fiolki

    [PA2014]Fiolki 题目大意: 有\(n(n\le2\times10^5)\)种不同的液体物质和\(n\)个容量无限的药瓶.初始时,第\(i\)个瓶内装着\(g_i\)克第\(i\)种液体. ...

  5. 初窥Java--2(下载Eclipse,安装tomcat插件)

    一.软件下载 Eclipse3.6 IDE for Java EE Developers: 下载地址:http://eclipse.org/downloads/ Tomcat Eclipse Plug ...

  6. BZOJ3022 : [Balkan2012]The Best Teams

    将选手和询问按照年龄排序,即可去掉年龄的限制. 将所有选手按水平排序后维护线段树,显然最优解一定是从大到小贪心选择. 线段树上每个节点维护: $g[0/1]:r+1$不选/选的时候,$l$选不选. $ ...

  7. mysql存储过程相关记录

    一个标准的存储过程创建语句 CREATE PROCEDURE myTestPro ( ), OUT rtv ) ) BEGIN SET rtv = text; END; 这个存储过程有一个输入参数以及 ...

  8. Spring IOC基础使用

    先下载.导入核心jar包 编写Book类和CollectionUse类 package MyPackageOne; public class Book { private String title; ...

  9. POJ1068 --(模拟)

    这题是在看一个书的时候的一个例题,当时并不明白啥意思,于是便找了下原题,以前没在POJ上刷过,这是开了个头,以后努力刷这个网站 题目大概意思是:http://poj.org/problem?id=10 ...

  10. Windows平台下SVN安装配置及使用

    原文链接:https://www.cnblogs.com/snake-hand/archive/2013/06/09/3130022.html,等有空了玩一玩吧,现在没空.