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

用法:

  1. var r = new List<temp> {
  2. new temp { a = },
  3. new temp { a = },
  4. new temp { a = }
  5. }.OrderBy("a");

来源:https://stackoverflow.com/questions/32061770/call-orderby-with-a-field-name-as-a-string

Lambda表达式按字段名字排序的更多相关文章

  1. Java8:使用Lambda表达式增强版Comparator排序

    学习路上的自我记录-------路好长,就问你慌不慌,大声港,不慌.----jstarseven. 实体类: package com.server.model; /** * Created by js ...

  2. Java Lambda 表达式 对 Map 对象排序

    Map<String,String> mailParams = new LinkedHashMap<>(); mailParams.put("Action" ...

  3. Entity Framework 通过Lambda表达式更新指定的字段

    本来需要EF来更新指定的字段,后来在园子里找到了代码 var StateEntry = ((IObjectContextAdapter)dbContext).ObjectContext.ObjectS ...

  4. Java8:Lambda表达式增强版Comparator和排序

    1.概述 在这篇教程里,我们将要去了解下即将到来的JDK 8(译注,现在JDK 8已经发布了)中的Lambda表达式——特别是怎样使用它来编写Comparator和对集合(Collection)进行排 ...

  5. 乐字节-Java8核心特性实战之Lambda表达式

    大家好,小乐又来给大家分享Java8核心特性了,上一篇文章是<乐字节|Java8核心实战-接口默认方法>,这次就来讲Java8核心特征之Lambda表达式. Java8 引入Lambda表 ...

  6. Java语言与JVM中的Lambda表达式全解

    Lambda表达式是自Java SE 5引入泛型以来最重大的Java语言新特性,本文是2012年度最后一期Java Magazine中的一篇文章,它介绍了Lamdba的设计初衷,应用场景与基本语法. ...

  7. 探索Java语言与JVM中的Lambda表达式

    Lambda表达式是自Java SE 5引入泛型以来最重大的Java语言新特性,本文是2012年度最后一期Java Magazine中的一篇文章,它介绍了Lamdba的设计初衷,应用场景与基本语法.( ...

  8. Java8 Collections.sort()及Arrays.sort()中Lambda表达式及增强版Comparator的使用

    摘要:本文主要介绍Java8 中Arrays.sort()及Collections.sort()中Lambda表达式及增强版Comparator的使用. 不废话直接上代码 import com.goo ...

  9. (摘录)ISO C++ Lambda表达式

    ISO C++ 11 标准的一大亮点是引入Lambda表达式.基本语法如下: [捕获列表](形参列表) mutable ->返回值类型 复合语句 其中除了"[]"(其中捕获列 ...

随机推荐

  1. Centos7】hostnamectl 设置主机名

    Centos7中提供了设置主机名的工具 hostnamectl hostname有三种状态 static(永久) transient(瞬态) pretty (灵活) 查看主机名状态 [oracle@h ...

  2. Linux命令:dirs

    语法 dirs [-clpv] [+N | -N] 说明 打印目录栈内容. 不带任何参数,在一行里打印.空白分隔. /home/code/dir/crypto /home/code/a/b /home ...

  3. [Linux] umask 从三类人群的权限中拿走权限数字

      作用   umask 用来设置用户创建文件.目录的默认权限,通过从权限中拿走相应的位,格式 `umask nnn`.     理解   rwx rwx rwx 权限对应三类人群,所属人,所属组,其 ...

  4. Java采用RSA加密及解密技术的有关Maven项目的配置流程:

    第一步: 获得RSA公钥私钥(秘钥格式:PKCS#8 ,测试使用的是无私钥密码的) 公钥: -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4G ...

  5. 简易机器学习代码(LR,Kmeans,NN,RNN)

    Logistic Regression 特别需要注意的是 exp 和 log 的使用. sigmoid 原始表达式为 1 / (1+exp(-z)),但如果直接使用 z=-710,会显示 overfl ...

  6. 实现CNN卷积神经网络

    以上是模型,下面是代码: import tensorflow as tf import numpy as np import time from tensorflow.examples.tutoria ...

  7. python数据类型及其详解

    一.数据类型介绍 1.字符串(string) 三种类型:单引号,双引号,三引号 a = 'jam' b = "JamHsiao" c = '''JAMHSIAO''' print( ...

  8. keepalived vip 没有生成或者生成了ping不通?

    1 问题现象:keepalived已启动但vip 没有生成./var/log/messages日志不断刷屏 tail /var/log/messages Nov :: cache-redis- Kee ...

  9. 关于textarea标签自己遇到的问题

    效果描述: 固定文本框的宽高,让文本框不被拖拽,让提示内容的文字垂直居中 html: <div> <label>活动详情</label> <textarea ...

  10. snmp监控f5

    1.硬盘各分区使用情况 2.pool数量.vs数量 3.cpu使用率 4.内存使用率 5.电源 6.风扇 7.端口状态及流量 8.HA状态(主备情况及HA是否处于建立状态) 9.主备机同步状态