LINQ 通过动态生成lambda表达式,实现根据指定属性名称对序列进行排序
2017-08-07 10:51
846 查看
目前,对于Linq只是初步接触,还不熟悉,做项目的时候想到一个问题,如果想要查询任意字段的排序结果集,该怎么实现?
我们知道,T-SQL是非常容易解决这个问题,只要简单通过拼接T-SQL就可以达到该效果。
那么,Linq该怎么实现呢?
网上查了很多资料,找到一种办法就是通过自定义拓展方法方式实现,具体实现代码如下:
调用如下:
执行结果如下:
当然,你也可以加多点查询条件,只要稍微修改下就可以了
其他参考:使用Expression动态创建lambda表达式
http://bbs.csdn.net/topics/390773344
Expression.Call 方法 (Type, String, Type[], Expression[])
IQueryProvider.CreateQuery 方法 (Expression)
http://www.cnblogs.com/126/archive/2007/09/09/887723.html
我们知道,T-SQL是非常容易解决这个问题,只要简单通过拼接T-SQL就可以达到该效果。
那么,Linq该怎么实现呢?
网上查了很多资料,找到一种办法就是通过自定义拓展方法方式实现,具体实现代码如下:
/// <summary> /// 根据指定属性名称对序列进行排序 /// </summary> /// <typeparam name="TSource">source中的元素的类型</typeparam> /// <param name="source">一个要排序的值序列</param> /// <param name="property">属性名称</param> /// <param name="descending">是否降序</param> /// <returns></returns> public static IQueryable<TSource> OrderBy<TSource>(this IQueryable<TSource> source, string property, bool descending) where TSource : class { ParameterExpression param = Expression.Parameter(typeof(TSource), "c"); PropertyInfo pi = typeof(TSource).GetProperty(property); MemberExpression selector = Expression.MakeMemberAccess(param, pi); LambdaExpression le = Expression.Lambda(selector, param); string methodName = (descending) ? "OrderByDescending" : "OrderBy"; MethodCallExpression resultExp = Expression.Call(typeof(Queryable), methodName, new Type[] { typeof(TSource), pi.PropertyType }, source.Expression, le); return source.Provider.CreateQuery<TSource>(resultExp); }
调用如下:
using (Entities entitys = new Entities()) { var lists = Kits.OrderBy(entitys.Members.Where(n => true), "MemberId", true).ToList(); }
执行结果如下:
当然,你也可以加多点查询条件,只要稍微修改下就可以了
其他参考:使用Expression动态创建lambda表达式
http://bbs.csdn.net/topics/390773344
Expression.Call 方法 (Type, String, Type[], Expression[])
IQueryProvider.CreateQuery 方法 (Expression)
http://www.cnblogs.com/126/archive/2007/09/09/887723.html
相关文章推荐
- LINQ 根据指定属性名称对序列进行排序
- 实体类实现根据指定属性进行排序
- 【转】Linq初体验——Order By 通过属性名动态排序
- asp.net根据条件动态生成GridView,并动态绑定列,且可对其进行编辑的实现
- 合并多个List<T>类型并通过LINQ按指定属性排序
- 对一篇英文短文进行统计排序(标点不考虑)。生成这样的结果: 整理出现的26(也可能不足26)个字母,根据字母出现的数量由多到少排序。若数量相同则按照字母表顺序列。 生成的结果大致为“ffffffffffffffffffffeeeeeeerrrrrrzzzzzzaaabbccu”。
- List<>根据指定属性排序(实现IComparer接口)
- Linq To Sql模式中自动生成T-SQL增删改操作系列~PropertyChanged事件实现在子类中记录属性的变化,在基类中进行统一处理
- 输入n个整数,编写函数实现以下操作,要求用指针实现: (1) 对n个数进行排序; (2) 将从指定位置的m个数逆序存放,例如:原序列为2,4,6,8,10,12,14,16,18,20,若要求把
- 函数-->指定函数--->默认函数--->动态函数--> 动态参数实现字符串格式化-->lambda表达式,简单函数的表示
- asp.net根据条件动态生成GridView,并动态绑定列,且可对其进行编辑的实现
- Java实现根据List中对象的相应属性进行排序
- 根据对象中某一属性进行升序降序排序的javascript实现
- linq 实现动态 orderby(根据参数名排序)
- MVC扩展控制器工厂,通过实现IControllerFactory,根据action名称生成不同的Controller
- Lambda表达式和Linq实现数据集的简单筛选并排序
- Spring 中 AbstractExcelView 支持根据模板生成Excel文件. 通过设置 view 的 URL 属性指定模板的路径
- postgresql根据指定序列进行自定义排序
- Linq初体验——Order By 通过属性名动态排序
- Linq初体验——Order By 通过属性名动态排序