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. 1099 Lottery

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1099 英文水平太差了,题目实在是不知道是什么意思,然后看了其他高手写的思路,才看明白. 题意,收集n张彩票 ...

  2. [CF768G] The Winds of Winter

    Discription: 断开树的每一个点会形成一个森林,然后可以进行一次操作:将森林中的一棵树接到另一棵树上.使得森林中size最大的树size最小.依次输出对于每个结点的最小size值 Hint: ...

  3. FPGA - 认识FPGA

    一.何为FPGA? FPGA,英文全拼:Field-Programmable Gate Array 现场可编程门阵列,它是在PAL.GAL.CPLD等可编程器件的基础上进一步发展的产物.它是作为专用集 ...

  4. [P1306] 斐波那契公约数 (矩阵快速幂+斐波那契数列)

    一开始数据没加强,一个简单的程序可以拿过 gcd(f[n],f[m])=f[gcd(n,m)] 下面这个是加强数据之后的80分代码 #include<bits/stdc++.h> usin ...

  5. shell脚本学习1(Linux脚本攻略)

    sudo <command> < arguments> 等价于root权限执行命令 赋予所有用户文件的可执行权限:chmod a+x script.sh 执行脚本:./scri ...

  6. 使用8.0版本jdbc驱动连接数据库操作

    转自:https://blog.csdn.net/qq_41734885/article/details/80562815 首先,我居然不能用navicat客户端连接上mysql8.0数据库报1251 ...

  7. Django中提供的6种缓存方式

    由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用: 缓存,缓存将一个某个views的返回值保存至内存或者memcache中, ...

  8. weblogic 下异常 org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken

    项目之前在 Tomcat 环境下一直都正常运行,今天应客户要求需要迁移到 webLogic 10.3.6 下, 部署后竟然抛出了 org.hibernate.QueryException: Class ...

  9. db2性能优化

    性能优化概述 DB2 的性能优化可以从三个方面分析:内存,CPU 和 I/O .DB2 性能优化是一件较为复杂的综合性的工作 , 需要对问题的根源作全方位的探索和思考.同时也需要较深厚的数据库管理经验 ...

  10. Node_初步了解(3)回调,作用域,上下文

    1. //回调:回调是异步编程最基本的方法,node.js需要按顺序执行异步逻辑的时候,一般采用后续传递的方式,将后续逻辑封装在回调函数中,作为起始函数的参数. //具名函数 function lea ...