博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
让Linq的OrderBy支持动态字段
阅读量:6701 次
发布时间:2019-06-25

本文共 1967 字,大约阅读时间需要 6 分钟。

使用linq的OrderBy,如果明确知道是哪个字段,当然很容易:

IQueryable
userQuery = ...; userQuery.OrderBy(u => u.Code)

但假如我们想写一个通用方法,预先并不知道要用哪个字段排序呢?

在网上寻寻觅觅,有许多国内的博客互相抄袭,信誓旦旦,但其实那些代码都运行不了。

还是老外的好使:

我拿来修改了一下,可以用。主要思想是扩展Queryable。但里面的东西有许多我都看不懂。

public static class QueryableExtension    {        public static IOrderedQueryable
OrderBy
(this IQueryable
query, string propertyName) { return _OrderBy
(query, propertyName, false); } public static IOrderedQueryable
OrderByDescending
(this IQueryable
query, string propertyName) { return _OrderBy
(query, propertyName, true); } static IOrderedQueryable
_OrderBy
(IQueryable
query, string propertyName,bool isDesc) { string methodname = (isDesc) ? "OrderByDescendingInternal" : "OrderByInternal"; var memberProp = typeof(T).GetProperty(propertyName); var method = typeof(QueryableExtension).GetMethod(methodname) .MakeGenericMethod(typeof(T), memberProp.PropertyType); return (IOrderedQueryable
)method.Invoke(null, new object[] { query, memberProp }); } public static IOrderedQueryable
OrderByInternal
(IQueryable
query, PropertyInfo memberProperty) { //public return query.OrderBy(_GetLamba
(memberProperty)); } public static IOrderedQueryable
OrderByDescendingInternal
(IQueryable
query, PropertyInfo memberProperty) { //public return query.OrderByDescending(_GetLamba
(memberProperty)); } static Expression
> _GetLamba
(PropertyInfo memberProperty) { if (memberProperty.PropertyType != typeof(TProp)) throw new Exception(); var thisArg = Expression.Parameter(typeof(T)); var lamba = Expression.Lambda
>(Expression.Property(thisArg, memberProperty), thisArg); return lamba; } }

调用:

IQueryable
userQuery = ...;//正序userQuery = userQuery.OrderBy("Code");//降序userQuery = userQuery.OrderByDescending("Code");

转载于:https://www.cnblogs.com/leftfist/p/6808785.html

你可能感兴趣的文章
Matrix Computations 1
查看>>
C#中几种数据库的大数据批量插入
查看>>
[flask]gunicorn配置文件
查看>>
牵丝戏
查看>>
OC-封装、继承、多态
查看>>
改需求
查看>>
linq中let关键字学习
查看>>
Java并发编程(多线程)中的相关概念
查看>>
6-14 数据库高级
查看>>
[QNAP crontab 定時執行程式
查看>>
listView当中有嵌套了有onClickListener的控件时ListView自身的onItemClick无响应的解决方案...
查看>>
本地浏览器缓存sessionStorage(临时存储) localStorage(长期存储)的使用
查看>>
python面试题目
查看>>
GIL , 线程池 , 同步 , 异步 , 队列 , 事件
查看>>
表单oninput和onchange事件区别
查看>>
[转]windows系统激活
查看>>
下划线按钮
查看>>
[JSOI2008]最小生成树计数
查看>>
Cantor定理的一种好表述
查看>>
陶哲轩实分析 定理 13.1.5
查看>>