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. [vscode] pylint在虚拟环境下错误告警问题

    在左下角点击python, 选择对应的虚拟环境即可.

  2. [HNOI2010]平面图判定

    Description: 若能将无向图 \(G=(V, E)\) 画在平面上使得任意两条无重合顶点的边不相交,则称 \(G\) 是平面图.判定一个图是否为平面图的问题是图论中的一个重要问题.现在假设你 ...

  3. C#编程 - 交通灯模拟

    程序写的有点繁杂,但大体功能出来的! 效果图: using System; using System.Collections.Generic; using System.Linq; using Sys ...

  4. Alpha冲刺(2/10)——2019.4.25

    所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺(2/10)--2019.4.25 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪 ...

  5. 关于django的部分

    新建Django工程 django-admin.exe startproject mysite 新建Django工程 新建static(静态模板文件存储路径) setting中配置static路径 S ...

  6. spring boot使用TestRestTemplate集成测试 RESTful 接口

    这篇文章没什么技术含量,只是单纯的记录一下如何用TestRestTemplate访问受security保护的api,供以后查阅. @Slf4j @RunWith(SpringRunner.class) ...

  7. How do I remove a particular element from an array in JavaScript?

    9090down voteaccepted Find the index of the array element you want to remove, then remove that index ...

  8. npm run dev

     npm run dev     npm run build

  9. linux 杀死进程

    列车进程 ps -ef 杀死进程 - 后面是pid kill 1234356

  10. Docker Mongo数据库主主同步配置方法

    一.背景 不多说,请看第一篇<Docker Mongo数据库主从同步配置方法> 二.具体操作方法 1.创建目录,如创建~/test/mongo_sr1和-/test/mongo_sr2两个 ...