EF OrderBy(string propertyname), OrderByDescending(string propertyname) 按属性排序,扩展方法
- public static class LinqExtensions
- {
- private static PropertyInfo GetPropertyInfo(Type objType, string name)
- {
- var properties = objType.GetProperties();
- var matchedProperty = properties.FirstOrDefault(p => p.Name == name);
- if (matchedProperty == null)
- throw new ArgumentException("name");
- return matchedProperty;
- }
- private static LambdaExpression GetOrderExpression(Type objType, PropertyInfo pi)
- {
- var paramExpr = Expression.Parameter(objType);
- var propAccess = Expression.PropertyOrField(paramExpr, pi.Name);
- var expr = Expression.Lambda(propAccess, paramExpr);
- return expr;
- }
- public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> query, string name)
- {
- var propInfo = GetPropertyInfo(typeof(T), name);
- var expr = GetOrderExpression(typeof(T), propInfo);
- var method = typeof(Enumerable).GetMethods().FirstOrDefault(m => m.Name == "OrderBy" && m.GetParameters().Length == 2);
- var genericMethod = method.MakeGenericMethod(typeof(T), propInfo.PropertyType);
- return (IEnumerable<T>)genericMethod.Invoke(null, new object[] { query, expr.Compile() });
- }
- public static IQueryable<T> OrderBy<T>(this IQueryable<T> query, string name)
- {
- var propInfo = GetPropertyInfo(typeof(T), name);
- var expr = GetOrderExpression(typeof(T), propInfo);
- var method = typeof(Queryable).GetMethods().FirstOrDefault(m => m.Name == "OrderBy" && m.GetParameters().Length == 2);
- var genericMethod = method.MakeGenericMethod(typeof(T), propInfo.PropertyType);
- return (IQueryable<T>)genericMethod.Invoke(null, new object[] { query, expr });
- }
- public static IEnumerable<T> OrderByDescending<T>(this IEnumerable<T> query, string name)
- {
- var propInfo = GetPropertyInfo(typeof(T), name);
- var expr = GetOrderExpression(typeof(T), propInfo);
- var method = typeof(Enumerable).GetMethods().FirstOrDefault(m => m.Name == "OrderByDescending" && m.GetParameters().Length == 2);
- var genericMethod = method.MakeGenericMethod(typeof(T), propInfo.PropertyType);
- return (IEnumerable<T>)genericMethod.Invoke(null, new object[] { query, expr.Compile() });
- }
- public static IQueryable<T> OrderByDescending<T>(this IQueryable<T> query, string name)
- {
- var propInfo = GetPropertyInfo(typeof(T), name);
- var expr = GetOrderExpression(typeof(T), propInfo);
- var method = typeof(Queryable).GetMethods().FirstOrDefault(m => m.Name == "OrderByDescending" && m.GetParameters().Length == 2);
- var genericMethod = method.MakeGenericMethod(typeof(T), propInfo.PropertyType);
- return (IQueryable<T>)genericMethod.Invoke(null, new object[] { query, expr });
- }
- }
YourDbContext db = new YourDbContext();
这样就可以直接使用下面这个方法了, db.TableName.OrderBy("ColumnName"), 用于动态排序时需要
EF OrderBy(string propertyname), OrderByDescending(string propertyname) 按属性排序,扩展方法的更多相关文章
- c# 扩展方法 奇思妙用 高级篇 九:OrderBy(string propertyName, bool desc)
下面是 Queryable 类 中最常用的两个排序的扩展方法: 1 2 public static IOrderedQueryable<TSource> OrderBy<TSourc ...
- c# ef 排序字段动态,构建动态Lambda和扩展方法OrderBy
1.动态构建排序 Lambda /// <summary> /// 获取排序Lambda(如果动态排序,类型不同会导致转换失败) /// </summary> /// < ...
- ASP.Net string 类的扩展方法 [转]
string 类的扩展方法列表(基本相同于 IEnumerable<T> 接口的成员列表): Aggregate<> //累加 All<> / ...
- c# String ,String[] 和 List<String>之间的转换
C#对字符串进行处理时,经常需要进行String,String[]和List<String>之间的转换 本文分析一下它们的差异和转换 一. 1. String > String[] ...
- 用java String类的getBytes(String charsetName)和String(byte[] bytes, String charsetName)解决乱码问题
Java中String的数据是如何存储的,查看源代码就可以知道,String的数据是存储在char[] value这样一个成员变量中的,char类型的大小在java中是2个字节 我们还知道,现在普遍使 ...
- 扩展方法 1 简单的string扩展方法
这里是关于 String的简单扩展方法 (静态类 静态方法 this 类型 这里是string) static class Program { static void Main(string[] ar ...
- string.IsNullOrEmpty和string.IsNullOrWhiteSpace方法的区别
string.IsNullOrEmpty 都知道,这个功能是判断字符串是否为:null或者string.Empty.如果是如"\t"这样的字符就返回false了,为了达到判断过滤这 ...
- 关于String str =new String("abc")和 String str = "abc"的比较
String是一个非常常用的类,应该深入的去了解String 如: String str =new String("abc") String str1 = "abc&qu ...
- Javascript中String()与new String()的差异
这里主要关注的是值类型和引用类型. 我们知道在javascript中的变量在内存中的存储有两种形式,值类型存储和引用类型存储. 通常可以进行值存储的包括 字符串类型,布尔值类型,数字类型,他们都包含 ...
随机推荐
- Pig性能优化
Pig性能优化 1. 尽早去除无用的数据 MapReduce Job的很大一部分开销在于磁盘IO和数据的网络传输,如果能尽早的去除无用的数据,减少数据量,会提升Pig的性能. 1). 尽早的使用Fil ...
- mongoDB入门必读(概念与实战并重)
一.概述 MongoDB是一个基于分布式文件存储的数据库开源项目.由C++语言编写.旨在为WEB应用提供可护展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是 ...
- VB.NET调用SQL Sever存储过程
概要: 本文介绍VB.NET使用创建并调用带有输入参数和输出参数的SQL Sever存储过程 本文代码首先检查要创建的存储过程再数据库中是否存在在.如果不存在,则代码创建一个存储过程,该过程一个参数来 ...
- C++ 头文件系列(array)
注意,该头文件仅在C++11中标准才开始出现. 简介 与语言内置的数组一样, array类模版支持几乎所有内置数组包含的特性: 顺序的(sequence) 内存连续的(contiguous stora ...
- jvm回收方法区
很多人认为方法区(或者HotSpot虚拟机中的永久代)是没有垃圾收集的,Java虚拟机规范中确实说过可以不要求虚拟机在方法区实现垃圾收集,而且在方法区进行垃圾收集的“性价比”一般比较低:在堆中,尤其是 ...
- Java多线程基础——线程间通信
在使用多线程的时候,经常需要多个线程进行协作来完成一件事情.在前面两章分析了Java多线程的基本使用以及利用synchronized来实现多个线程同步调用方法或者执行代码块.但上面两章的内容涉及到的例 ...
- python3.5学习之路_day1_login
登录程序1.输入用户名密码2.认证成功后显示欢迎信息3.输错三次后锁定 #!/usr/bin/env python #_*_coding:utf-8_*_ #by anthor zhangxiaoyu ...
- 使用idea Live Template实现eclipse syso自动提示代码功能
转载:http://blog.sina.com.cn/s/blog_4c4195e70102wh7e.html 具体步骤: 1.点击File-->Setting-->Live Templa ...
- 想入门webpack,这篇就够了
申明:本文转载自简书 文/zhangwang(简书作者)原文链接:http://www.jianshu.com/p/42e11515c10f#著作权归作者所有,转载请联系作者获得授权,并标注" ...
- Web.config 文件中的 system.webServer
Web.config 文件中的 system.webServer 节用于指定适用于 Web 应用程序的 IIS 7.0 设置.system.WebServer 是 configuration 节的子级 ...