1. public static class LinqExtensions
  2. {
  3. private static PropertyInfo GetPropertyInfo(Type objType, string name)
  4. {
  5. var properties = objType.GetProperties();
  6. var matchedProperty = properties.FirstOrDefault(p => p.Name == name);
  7. if (matchedProperty == null)
  8. throw new ArgumentException("name");
  9.  
  10. return matchedProperty;
  11. }
  12. private static LambdaExpression GetOrderExpression(Type objType, PropertyInfo pi)
  13. {
  14. var paramExpr = Expression.Parameter(objType);
  15. var propAccess = Expression.PropertyOrField(paramExpr, pi.Name);
  16. var expr = Expression.Lambda(propAccess, paramExpr);
  17. return expr;
  18. }
  19.  
  20. public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> query, string name)
  21. {
  22. var propInfo = GetPropertyInfo(typeof(T), name);
  23. var expr = GetOrderExpression(typeof(T), propInfo);
  24.  
  25. var method = typeof(Enumerable).GetMethods().FirstOrDefault(m => m.Name == "OrderBy" && m.GetParameters().Length == 2);
  26. var genericMethod = method.MakeGenericMethod(typeof(T), propInfo.PropertyType);
  27. return (IEnumerable<T>)genericMethod.Invoke(null, new object[] { query, expr.Compile() });
  28. }
  29.  
  30. public static IQueryable<T> OrderBy<T>(this IQueryable<T> query, string name)
  31. {
  32. var propInfo = GetPropertyInfo(typeof(T), name);
  33. var expr = GetOrderExpression(typeof(T), propInfo);
  34.  
  35. var method = typeof(Queryable).GetMethods().FirstOrDefault(m => m.Name == "OrderBy" && m.GetParameters().Length == 2);
  36. var genericMethod = method.MakeGenericMethod(typeof(T), propInfo.PropertyType);
  37. return (IQueryable<T>)genericMethod.Invoke(null, new object[] { query, expr });
  38. }
  39.  
  40. public static IEnumerable<T> OrderByDescending<T>(this IEnumerable<T> query, string name)
  41. {
  42. var propInfo = GetPropertyInfo(typeof(T), name);
  43. var expr = GetOrderExpression(typeof(T), propInfo);
  44.  
  45. var method = typeof(Enumerable).GetMethods().FirstOrDefault(m => m.Name == "OrderByDescending" && m.GetParameters().Length == 2);
  46. var genericMethod = method.MakeGenericMethod(typeof(T), propInfo.PropertyType);
  47. return (IEnumerable<T>)genericMethod.Invoke(null, new object[] { query, expr.Compile() });
  48. }
  49.  
  50. public static IQueryable<T> OrderByDescending<T>(this IQueryable<T> query, string name)
  51. {
  52. var propInfo = GetPropertyInfo(typeof(T), name);
  53. var expr = GetOrderExpression(typeof(T), propInfo);
  54.  
  55. var method = typeof(Queryable).GetMethods().FirstOrDefault(m => m.Name == "OrderByDescending" && m.GetParameters().Length == 2);
  56. var genericMethod = method.MakeGenericMethod(typeof(T), propInfo.PropertyType);
  57. return (IQueryable<T>)genericMethod.Invoke(null, new object[] { query, expr });
  58. }
  59. }

YourDbContext db = new  YourDbContext();

这样就可以直接使用下面这个方法了, db.TableName.OrderBy("ColumnName"), 用于动态排序时需要

EF OrderBy(string propertyname), OrderByDescending(string propertyname) 按属性排序,扩展方法的更多相关文章

  1. c# 扩展方法 奇思妙用 高级篇 九:OrderBy(string propertyName, bool desc)

    下面是 Queryable 类 中最常用的两个排序的扩展方法: 1 2 public static IOrderedQueryable<TSource> OrderBy<TSourc ...

  2. c# ef 排序字段动态,构建动态Lambda和扩展方法OrderBy

    1.动态构建排序 Lambda /// <summary> /// 获取排序Lambda(如果动态排序,类型不同会导致转换失败) /// </summary> /// < ...

  3. ASP.Net string 类的扩展方法 [转]

    string 类的扩展方法列表(基本相同于 IEnumerable<T> 接口的成员列表): Aggregate<>     //累加 All<>        / ...

  4. c# String ,String[] 和 List<String>之间的转换

    C#对字符串进行处理时,经常需要进行String,String[]和List<String>之间的转换 本文分析一下它们的差异和转换 一. 1. String > String[] ...

  5. 用java String类的getBytes(String charsetName)和String(byte[] bytes, String charsetName)解决乱码问题

    Java中String的数据是如何存储的,查看源代码就可以知道,String的数据是存储在char[] value这样一个成员变量中的,char类型的大小在java中是2个字节 我们还知道,现在普遍使 ...

  6. 扩展方法 1 简单的string扩展方法

    这里是关于 String的简单扩展方法 (静态类 静态方法 this 类型 这里是string) static class Program { static void Main(string[] ar ...

  7. string.IsNullOrEmpty和string.IsNullOrWhiteSpace方法的区别

    string.IsNullOrEmpty 都知道,这个功能是判断字符串是否为:null或者string.Empty.如果是如"\t"这样的字符就返回false了,为了达到判断过滤这 ...

  8. 关于String str =new String("abc")和 String str = "abc"的比较

    String是一个非常常用的类,应该深入的去了解String 如: String str =new String("abc") String str1 = "abc&qu ...

  9. Javascript中String()与new String()的差异

    这里主要关注的是值类型和引用类型. 我们知道在javascript中的变量在内存中的存储有两种形式,值类型存储和引用类型存储. 通常可以进行值存储的包括  字符串类型,布尔值类型,数字类型,他们都包含 ...

随机推荐

  1. Pig性能优化

    Pig性能优化 1. 尽早去除无用的数据 MapReduce Job的很大一部分开销在于磁盘IO和数据的网络传输,如果能尽早的去除无用的数据,减少数据量,会提升Pig的性能. 1). 尽早的使用Fil ...

  2. mongoDB入门必读(概念与实战并重)

    一.概述 MongoDB是一个基于分布式文件存储的数据库开源项目.由C++语言编写.旨在为WEB应用提供可护展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是 ...

  3. VB.NET调用SQL Sever存储过程

    概要: 本文介绍VB.NET使用创建并调用带有输入参数和输出参数的SQL Sever存储过程 本文代码首先检查要创建的存储过程再数据库中是否存在在.如果不存在,则代码创建一个存储过程,该过程一个参数来 ...

  4. C++ 头文件系列(array)

    注意,该头文件仅在C++11中标准才开始出现. 简介 与语言内置的数组一样, array类模版支持几乎所有内置数组包含的特性: 顺序的(sequence) 内存连续的(contiguous stora ...

  5. jvm回收方法区

    很多人认为方法区(或者HotSpot虚拟机中的永久代)是没有垃圾收集的,Java虚拟机规范中确实说过可以不要求虚拟机在方法区实现垃圾收集,而且在方法区进行垃圾收集的“性价比”一般比较低:在堆中,尤其是 ...

  6. Java多线程基础——线程间通信

    在使用多线程的时候,经常需要多个线程进行协作来完成一件事情.在前面两章分析了Java多线程的基本使用以及利用synchronized来实现多个线程同步调用方法或者执行代码块.但上面两章的内容涉及到的例 ...

  7. python3.5学习之路_day1_login

    登录程序1.输入用户名密码2.认证成功后显示欢迎信息3.输错三次后锁定 #!/usr/bin/env python #_*_coding:utf-8_*_ #by anthor zhangxiaoyu ...

  8. 使用idea Live Template实现eclipse syso自动提示代码功能

    转载:http://blog.sina.com.cn/s/blog_4c4195e70102wh7e.html 具体步骤: 1.点击File-->Setting-->Live Templa ...

  9. 想入门webpack,这篇就够了

    申明:本文转载自简书 文/zhangwang(简书作者)原文链接:http://www.jianshu.com/p/42e11515c10f#著作权归作者所有,转载请联系作者获得授权,并标注" ...

  10. Web.config 文件中的 system.webServer

    Web.config 文件中的 system.webServer 节用于指定适用于 Web 应用程序的 IIS 7.0 设置.system.WebServer 是 configuration 节的子级 ...