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. CODEVS.5037.线段树练习4加强版(分块 区间k的倍数)

    题目链接 /* 如果用线段树,每个节点要再开k的空间,显然不行.但是分块可以(虽然空间依旧爆炸) 分块.用bloans[i][j]表示 第i块 模k为j 的有多少个 对于不是整块的,查询时应判断 A[ ...

  2. LINUX文件及目录管理命令基础

    Linux命令行组成结构 Linux命令结构 在Linux中一切皆文件,一切皆命令! 命令提示符: [root@tt ~]# [xiaohui@tt ~]$ Linux命令行常用快捷键 ctrl + ...

  3. Java Web 域名

    虽然可以直接通过IP地址来访问WWW的每一台主机,但是32位IP地址非常难记.所以,为了便于记忆,按照一定的规则给Internet上的计算机起了名字即域名.通俗地说,域名相当于一个房屋的门牌号码,别人 ...

  4. xcode9上传app时报错iTunes Store operation failed 解决方案

    问题 上传至itunes Connect时报了两个错: iTunes Store Operation Failed ERROR ITMS-xxxxx:"description length: ...

  5. ES6项目构建(babel+gulp+webpack)

    (一)基础架构 (二)任务自动化(gulp) (三)编译工具(babel,webpack) (四)代码实现 一.基础构架 1.app : 放置前端代码 css : css文件 js : js文件 cl ...

  6. 使用mkbootfs制作ramdisk根文件系统

    span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }.CodeMirror ...

  7. Scala编程基础

    Scala与Java的关系... 4 安装Scala. 4 Scala解释器的使用... 4 声明变量... 5 数据类型与操作符... 5 函数调用与apply()函数... 5 if表达式... ...

  8. zookeeper三节点集群安装记录

    以下是3个节点的zk安装记录. 下载 下载地址: http://mirrors.shu.edu.cn/apache/zookeeper/ cd /data/opt/zk wget http://mir ...

  9. phpt5支付宝登陆支付接口解析

    先看效果图 下面的源码来源网络,自己对照修改. 放入一个插件库中,方便管理 创建支付类 1.发起支付 public function init() { $order_id = $_REQUEST['o ...

  10. [Linux] - SVN忽略文件夹更新的命令与方法

    在服务器上有时需要忽略某个文件夹及内容的更新,可以使用命令: svn update --set-depth=exclude FOLDER_NAME 比如需要忽略static目录: svn update ...