Lambda表达式按字段名字排序
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Linq.Expressions;
- using System.Reflection;
- 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 == );
- 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 == );
- 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 == );
- 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 == );
- var genericMethod = method.MakeGenericMethod(typeof(T), propInfo.PropertyType);
- return (IQueryable<T>)genericMethod.Invoke(null, new object[] { query, expr });
- }
- }
用法:
- var r = new List<temp> {
- new temp { a = },
- new temp { a = },
- new temp { a = }
- }.OrderBy("a");
来源:https://stackoverflow.com/questions/32061770/call-orderby-with-a-field-name-as-a-string
Lambda表达式按字段名字排序的更多相关文章
- Java8:使用Lambda表达式增强版Comparator排序
学习路上的自我记录-------路好长,就问你慌不慌,大声港,不慌.----jstarseven. 实体类: package com.server.model; /** * Created by js ...
- Java Lambda 表达式 对 Map 对象排序
Map<String,String> mailParams = new LinkedHashMap<>(); mailParams.put("Action" ...
- Entity Framework 通过Lambda表达式更新指定的字段
本来需要EF来更新指定的字段,后来在园子里找到了代码 var StateEntry = ((IObjectContextAdapter)dbContext).ObjectContext.ObjectS ...
- Java8:Lambda表达式增强版Comparator和排序
1.概述 在这篇教程里,我们将要去了解下即将到来的JDK 8(译注,现在JDK 8已经发布了)中的Lambda表达式——特别是怎样使用它来编写Comparator和对集合(Collection)进行排 ...
- 乐字节-Java8核心特性实战之Lambda表达式
大家好,小乐又来给大家分享Java8核心特性了,上一篇文章是<乐字节|Java8核心实战-接口默认方法>,这次就来讲Java8核心特征之Lambda表达式. Java8 引入Lambda表 ...
- Java语言与JVM中的Lambda表达式全解
Lambda表达式是自Java SE 5引入泛型以来最重大的Java语言新特性,本文是2012年度最后一期Java Magazine中的一篇文章,它介绍了Lamdba的设计初衷,应用场景与基本语法. ...
- 探索Java语言与JVM中的Lambda表达式
Lambda表达式是自Java SE 5引入泛型以来最重大的Java语言新特性,本文是2012年度最后一期Java Magazine中的一篇文章,它介绍了Lamdba的设计初衷,应用场景与基本语法.( ...
- Java8 Collections.sort()及Arrays.sort()中Lambda表达式及增强版Comparator的使用
摘要:本文主要介绍Java8 中Arrays.sort()及Collections.sort()中Lambda表达式及增强版Comparator的使用. 不废话直接上代码 import com.goo ...
- (摘录)ISO C++ Lambda表达式
ISO C++ 11 标准的一大亮点是引入Lambda表达式.基本语法如下: [捕获列表](形参列表) mutable ->返回值类型 复合语句 其中除了"[]"(其中捕获列 ...
随机推荐
- Centos7】hostnamectl 设置主机名
Centos7中提供了设置主机名的工具 hostnamectl hostname有三种状态 static(永久) transient(瞬态) pretty (灵活) 查看主机名状态 [oracle@h ...
- Linux命令:dirs
语法 dirs [-clpv] [+N | -N] 说明 打印目录栈内容. 不带任何参数,在一行里打印.空白分隔. /home/code/dir/crypto /home/code/a/b /home ...
- [Linux] umask 从三类人群的权限中拿走权限数字
作用 umask 用来设置用户创建文件.目录的默认权限,通过从权限中拿走相应的位,格式 `umask nnn`. 理解 rwx rwx rwx 权限对应三类人群,所属人,所属组,其 ...
- Java采用RSA加密及解密技术的有关Maven项目的配置流程:
第一步: 获得RSA公钥私钥(秘钥格式:PKCS#8 ,测试使用的是无私钥密码的) 公钥: -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4G ...
- 简易机器学习代码(LR,Kmeans,NN,RNN)
Logistic Regression 特别需要注意的是 exp 和 log 的使用. sigmoid 原始表达式为 1 / (1+exp(-z)),但如果直接使用 z=-710,会显示 overfl ...
- 实现CNN卷积神经网络
以上是模型,下面是代码: import tensorflow as tf import numpy as np import time from tensorflow.examples.tutoria ...
- python数据类型及其详解
一.数据类型介绍 1.字符串(string) 三种类型:单引号,双引号,三引号 a = 'jam' b = "JamHsiao" c = '''JAMHSIAO''' print( ...
- keepalived vip 没有生成或者生成了ping不通?
1 问题现象:keepalived已启动但vip 没有生成./var/log/messages日志不断刷屏 tail /var/log/messages Nov :: cache-redis- Kee ...
- 关于textarea标签自己遇到的问题
效果描述: 固定文本框的宽高,让文本框不被拖拽,让提示内容的文字垂直居中 html: <div> <label>活动详情</label> <textarea ...
- snmp监控f5
1.硬盘各分区使用情况 2.pool数量.vs数量 3.cpu使用率 4.内存使用率 5.电源 6.风扇 7.端口状态及流量 8.HA状态(主备情况及HA是否处于建立状态) 9.主备机同步状态