EntityFramework 动态构造排序 FuncIQueryableT, IOrderedQueryableT 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 = 0; 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[0]);MemberExpression propertyAccess = Expression.MakeMemberAccess(arg, property);for (int j = 1; 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 = 0;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": [[8, "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 == 1) {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(1, data.length - 2));return dt.Format("yyyy-MM-dd hh:mm:ss");}}]});

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hdu 5310 Souvenir

http://acm.hdu.edu.cn/showproblem.php?pid5310 题意&#xff1a;今天是BestCoder一周年纪念日. 比赛管理员Soda想要给每个参赛者准备一个纪念品. 商店里纪念品的单价是p 元, 同时也可以花q 元购买纪念品套装, 一个套装里有m 个纪念品. 今天总共有n 个参赛者, Soda想要知道最…

ArcGIS 10.2中栅格数据的属性表问题

什么条件下我们能在ArcGIS中看到栅格数据的属性表呢? 网上的说法是:对于单波段的整型ESRI GRID数据,如果它的像元值范围小于10万(max-min<1000000),并且少于500条唯一值,那么软件会为它创建一个“真正”的属性表存储在INFO文件夹的grid.VAT表格中。对于不满足上述条…

python简介及环境安装

Python的创始人为荷兰人吉多范罗苏姆 。1989年圣诞节期间&#xff0c;在阿姆斯特丹&#xff0c;Guido为了打发圣诞节的无趣&#xff0c;决心开发一个新的脚本解释程序&#xff0c;作为ABC语言的一种继承。 Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释…

剑指offer之求两个数之和(不能使用四则运算)

1 题目 剑指offer之求两个数之和(不能使用四则运算) 2 代码实现 #include<stdio.h>int add(int num1, int num2) {int sum1;int carry;do{sum1 (num1 ^ num2);carry (num1 & num2) << 1;num1 sum1;num2 carry;} while (carry ! 0);return num1; }int mai…

ZOJ 3879 Capture the Flag(模拟)

思路&#xff1a;恶心模拟...照着题目怎么说就怎么做就好了 #include<bits/stdc.h> using namespace std; const int maxn 100000; #define exp 1e-5 struct Node {int id,rank;double score; }nodes[105];int vis[105][105][105]; int visit[105]; bool cmp1(Node a,No…

晋中学院计算机考研,晋中学院有多少人死在考研路上

晋中学院有多少人死在考研路上(2011-05-23 20:34:30)标签&#xff1a;日记杂谈有一句话叫作&#xff1a;长江后浪推前浪,前浪死在沙滩上&#xff0c;用来形容少年老成与故人的可怜。转眼间到了谋取出路的时候了&#xff0c;班上几乎所有的人都在那里嚷嚷的要考研&#xff0c;但…

解决ArcGIS 9.3卸载时出现invalid install.log file的方法

地信君都知道,ArcGIS 9.3 License卸载时常出现“invalid install.log file”的错误提示,而导致卸载失败,如下:

Nodejs前端服务器压缩图片

Nodejs作为前端服务器&#xff0c;自然能承担处理图片的能力&#xff0c; 使用GM for nodejs 作为图片处理器&#xff0c;调用ImageMagick处理图片 使用ImageMagick var imageMagick gm.subClass({ imageMagick: true }); 然后就像文档中使用gm那样使用ImageMagick即可 &#…

人工神经网络心得体会_卷积神经网络学习心得

萌新小白一只&#xff0c;刚刚接触AI&#xff0c;在遍历人工智能发展时就看到了“卷积神经网络”&#xff0c;顿时想到了去年被概率论支配的恐惧&#xff0c;因此想在这里分享一点经验来帮助大家更好理解。所谓“卷积神经网络”&#xff0c;就是结合卷积公式&#xff0c;建立类…

使用virt-install安装kvm虚拟机时需要的问题

使用virt-install安装kvm虚拟机时需要的问题今天在做kvm的实验时&#xff0c;使用virt-install安装虚拟机的过程中遇到了一些问题&#xff0c;其中有一个问题弄了好久都没有弄好&#xff0c;不过现在已经好了。由于我使用virt-install命令安装虚拟机的&#xff0c;其命令如下&a…

样式和主题的区别(Styles and Themes)

参考资料&#xff1a; http://www.tuicool.com/articles/VfiUba http://android.blog.51cto.com/268543/303728/转载于:https://www.cnblogs.com/8dull/p/5387072.html

从同步函数 hello-world-dotnet 开始探索OpenFunction

OpenFunction[1] 是一个现代化的云原生 FaaS&#xff08;函数即服务&#xff09;框架&#xff0c;它引入了很多非常优秀的开源技术栈&#xff0c;包括 Knative、Tekton、Shipwright、Dapr、KEDA 等&#xff0c;这些技术栈为打造新一代开源函数计算平台提供了无限可能&#xff1…

剑指offer之股票的最大利润

1 问题 求股票的最大利润&#xff0c;简言之就是求一个数组里面元素差的最大值&#xff0c;要求时间复杂度O(n) 2 代码实现 #include <stdio.h> #include <stdlib.h>int maxDiff(int *number, int length) {if (NULL number || length < 2){return 0;}int mi…

【ArcGIS风暴】ArcGIS 10.2栅格计算器实用公式大全(经典珍藏版)

栅格计算器(Raster Calculator) 是一种空间分析函数工具,可以输入地图代数表达式,使用运算符和函数来做数学计算,建立选择查询,或键入地图代数语法。只有熟练的运用并记忆一些常用的公式,才能很好的运用栅格计算器。本文将常见的及一些容易出错的公式予以总结,方便学习…

试卷代号6098计算机应用基础,2231电大《Visual Basic程序设计》试题和答案200507

试卷代号&#xff1a;2231座位号口口中央广播电视大学2004-2005学年度第二学期"开放专科"期末考试计算(应)、软件信息软 件 网 站 专业 VisualBasic程序设计 试题2005年7月题 号一二三四五总 分分 数得 分评卷人一&#xff0c;单项选择题(每小题2分&#xff0c;共30分…

还不会制作游戏脚本解放双手?那是你不会超强自动化框架AirTest!

最近朋友问我能不能写一个自动化&#xff0c;帮他解放一下双手。我想了想&#xff0c;在我知识里很多辅助脚本制作工具&#xff0c;想想那些可能会有一堆局限性&#xff0c;想到了Python有自动化测试游戏框架或者工具&#xff0c;但是一直没有了解&#xff0c;搜了下资料&#…

[js高手之路]使用原型对象(prototype)需要注意的地方

我们先来一个简单的构造函数原型对象的小程序 1 function CreateObj( uName, uAge ) {2 this.userName uName;3 this.userAge uAge;4 }5 CreateObj.prototype.showUserName function () {6 return this.userNa…

python 虚拟环境原理_Python 虚拟环境

建议在开发环境和生产环境下都使用虚拟环境来管理项目的依赖。 - Flask背景Python 应用通常会使用一些第三方的软件包和模块。不同的应用可能会依赖不同版本的同一个软件包&#xff0c;或者依赖不同的 Python 版本。设想这样的场景:小白之前有一个 Flask 0.10 做的网站并且一直…

pullToRefresh下拉刷新上拉加载

PullToRefresh 是一个第三方的工程。 之前的自定义下拉刷新控件貌似不太好用&#xff0c;于是网上找了这个。 参考&#xff1a;http://www.cnblogs.com/summers/p/4343964.html 主要是一些功能都提供了接口&#xff0c;不需要自己再写了。 废话不多说&#xff0c;上干货。 1、布…

ArcGIS删除地图投影坐标,只保留地理坐标

今天突发奇想,在ArcGIS中进行投影转换很容易,那么如何删除投影坐标,只保留地理坐标呢? 一开始想着从投影文件(.prj)入手,删除其投影信息,结构不尽如人意。 如果从定义地理坐标(Define Projection)的角度入手,重新定义地理坐标,如WGS84呢?经过尝试之…