EntityFramework 动态构造排序 Func<IQueryable<T>, IOrderedQueryable<T>> Dynamic
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的更多相关文章
- 动态构造任意复杂的 Linq Where 表达式
前言 Linq 是 C# 中一个非常好用的集合处理库,用好了能帮我们简化大量又臭又长的嵌套循环,使处理逻辑清晰可见.EF 查询主要也是依赖 Linq.但是 Linq 相对 sql 也存在一些缺点,最主 ...
- Linq to Sql : 动态构造Expression进行动态查询
原文:Linq to Sql : 动态构造Expression进行动态查询 前一篇在介绍动态查询时,提到一个问题:如何根据用户的输入条件,动态构造这个过滤条件表达式呢?Expression<Fu ...
- [2014-12-30]如何动态构造Lambda表达式(动态构造Lambda查询条件表达式)
声明 本文对Lambda表达式的扩展,示例代码来源于网络. 场景描述 web开发查询功能的时候,如果查询条件比较多,就会遇到动态组合查询条件的情况.在手写sql的情况下,我们一般会根据传入的参数,针对 ...
- easyui datagrid remoteSort的实现 Controllers编写动态的Lambda表达式 IQueryable OrderBy扩展
EF 结合easy-ui datagrid 实现页面端排序 EF动态编写排序Lambda表达式 1.前端页面 var mainListHeight = $(window).height() - 20; ...
- Activator 动态构造对象
Activator 意义: 用于动态构造对象 语法1: 根据指定的泛型类型构造对象 Activator.CreateInstance<类型>() 语法2: 根据程序集和类型名构造对象 S ...
- EntityFramework动态组合多排序字段
前言:在使用EF当中,肯定会遇到动态查询的需求,建立一个公共调用的动态组合表达式查询也是必不可少的,以下是建立动态组合多排序字段做个记录,供以后调用 1.建立一个结构,用于多个排序字段组合,这个结构体 ...
- Entity Framework 动态构造Lambda表达式Expression<Func<T, bool>>
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; us ...
- Linq 动态查询排序
Linq的排序一般是这样写的: query.OrderBy(x => x.Tel).Skip().Take(); 实际使用中排序字段可能是通过字符类型的参数来设置的,于是想这样实现: query ...
- Linq 动态组合排序(Lambda)
最近有个项目需要做一个排班的功能,需要对排班的数据按不同的规则进行排序:因为排序规则是动态变化的,所以不太适合放到数据库中(临时表)中处理: 所以考虑使用Linq的排序方式(按不同的条件判断条件组合排 ...
随机推荐
- tomcat端口被占用的问题
在dos下,输入 netstat -ano|findstr 8080 //说明:查看占用8080端口的进程 显示占用端口的进程 taskkill /pid 6856 /f //说明, ...
- 04 树莓派截图软件scrot的安装和使用
2017-08-22 13:52:52 sudo apt-get install scrot 捕捉活动窗口(按下回车后,3秒之内点击要捕捉的窗口): scrot -d 3 -u 捕捉选定的区域(按下回 ...
- Flask 三方组件 Flask-Session
使用 from flask import session, Flask from flask_session import Session from redis import Redis app = ...
- Maven实战(七)——常用Maven插件介绍(上)
我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven-compiler-plugin完成的.进一步说,每个任务对应了 ...
- 【原】通过AOP实现MyBatis多数据源的动态切换
[环境参数]1.开发框架:Spring + SpringMVC + MyBatis 2.数据库A的URL:jdbc.url=jdbc:mysql://172.16.17.164:3306/ test? ...
- mysql 命令语句
1.大部分数据库命令语句 数据库的命令 net start MYsql 启动的服务 net stop mysql 关闭服务 mysql -uroot -p 输入数据库名和密码登入 show datab ...
- 搜狗拼音输入法 V9.1.0.2589 最新去广告精简优化版
搜狗拼音输入法9.0 正式版例行发布,最新版字母代号b,详细版本号为v9.1.0.2589:搜狗拼音输入法是电脑装机必备软件,版本有传统版和智慧版之分,其打字超准.词库超大.速度飞快.外观漂亮,因此使 ...
- golang的dlv调试工具print打印字符串显示more,无法显示更多
使用dlv (delve golang调试器)打印字符串无法打印全,只能打印一部分(64个字节),在gdb中有 (gdb) set print elements Argument required ( ...
- php 通过 create user 和grant 命令无法创建数据库用户和授权的解决办法
php 通过 create user 和grant 命令无法创建数据库用户和授权的解决办法 解决办法, 通过 insert 命令的方式进行创建. 创建数据库用户: $sql= "insert ...
- git强制修改注释
在一些公司项目中,常常要求git注释提交的时候加上前缀,比如JIRA号,但是有的时候我们常常会忘了 如果用source tree等一些工具,会推送到本地仓库一半,但远程又上不去. 这个时候我们就需要强 ...