直接上代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions; namespace ConsoleApplication1
{
public static class Extensions
{
public static Predicate<T> ToPredicate<T>(this Func<T, bool> source)
{
Predicate<T> result = new Predicate<T>(source);
return result;
}
} public class LambdaExtention<T>
{
/// <summary>
/// 表达式集合
/// </summary>
private List<Expression> m_lstExpression = null; /// <summary>
/// 参数
/// </summary>
private ParameterExpression m_Parameter = null; /// <summary>
/// 构造函数
/// </summary>
public LambdaExtention()
{
m_lstExpression = new List<Expression>();
m_Parameter = Expression.Parameter(typeof(T), "x");
} /// <summary>
/// 字符串Contains筛选
/// </summary>
/// <param name="expProperty">表达式属性</param>
/// <param name="objValue">值</param>
public void Contains(Expression<Func<T, object>> expProperty, object objValue)
{
Expression expRes = Expression.Call(GetMemberExpression(expProperty), typeof(string).GetMethod("Contains"),
Expression.Constant(objValue)); m_lstExpression.Add(expRes);
} /// <summary>
/// 等于
/// </summary>
/// <param name="expProperty">表达式属性</param>
/// <param name="objValue">值</param>
public void Equal(Expression<Func<T, object>> expProperty, object objValue)
{
var member = GetMemberExpression(expProperty);
Expression expRes = Expression.Equal(member, Expression.Constant(objValue, member.Type));
m_lstExpression.Add(expRes);
} /// <summary>
/// 等于
/// </summary>
/// <param name="expProperty">表达式属性</param>
/// <param name="objValue">值</param>
public void Equal(string strProperty, object objValue)
{
var member = GetMemberExpression(strProperty);
Expression expRes = Expression.Equal(member, Expression.Constant(objValue, member.Type));
m_lstExpression.Add(expRes);
} /// <summary>
/// 小于
/// </summary>
/// <param name="expProperty">表达式属性</param>
/// <param name="objValue">值</param>
public void LessThan(Expression<Func<T, object>> expProperty, object objValue)
{
var member = GetMemberExpression(expProperty);
Expression expRes = Expression.LessThan(member, Expression.Constant(objValue, member.Type));
m_lstExpression.Add(expRes);
} /// <summary>
/// 小于等于
/// </summary>
/// <param name="expProperty">表达式属性</param>
/// <param name="objValue">值</param>
public void LessThanOrEqual(Expression<Func<T, object>> expProperty, object objValue)
{
var member = GetMemberExpression(expProperty);
Expression expRes = Expression.LessThanOrEqual(member, Expression.Constant(objValue, member.Type));
m_lstExpression.Add(expRes);
} /// <summary>
/// 大于
/// </summary>
/// <param name="expProperty">表达式属性</param>
/// <param name="objValue">值</param>
public void GreaterThan(Expression<Func<T, object>> expProperty, object objValue)
{
var member = GetMemberExpression(expProperty);
Expression expRes = Expression.GreaterThan(member, Expression.Constant(objValue, member.Type));
m_lstExpression.Add(expRes);
} /// <summary>
/// 大于等于
/// </summary>
/// <param name="expProperty">表达式属性</param>
/// <param name="objValue">值</param>
public void GreaterThanOrEqual(Expression<Func<T, object>> expProperty, object objValue)
{
var member = GetMemberExpression(expProperty);
Expression expRes = Expression.GreaterThanOrEqual(member, Expression.Constant(objValue, member.Type));
m_lstExpression.Add(expRes);
} /// <summary>
/// 为真方法
/// </summary>
/// <param name="expProperty">表达式属性</param>
/// <param name="objValue">值</param>
/// <param name="typeName">类名名称</param>
/// <param name="methodName">方法名称</param>
public void IsTureMethod(Expression<Func<T, object>> expProperty, object objValue, string typeName, string methodName)
{
Expression expRes = Expression.IsTrue(GetMemberExpression(expProperty), Type.GetType(typeName).GetMethod(methodName)
); m_lstExpression.Add(expRes);
} /// <summary>
/// 获得Lambda
/// </summary>
/// <returns>返回Lambda</returns>
private LambdaExpression GetLambda()
{
Expression whereExpr = null; foreach (var expr in this.m_lstExpression)
{
if (whereExpr == null)
{
whereExpr = expr;
}
else
{
whereExpr = Expression.And(whereExpr, expr);
}
} if (whereExpr == null)
{
return null;
} return Expression.Lambda(whereExpr, m_Parameter);
} /// <summary>
/// 获得谓词
/// </summary>
/// <returns>返回谓词</returns>
public Predicate<T> GetPredicate()
{
Func<T, bool> match = (Func<T, bool>)GetLambda().Compile(); return match.ToPredicate();
} /// <summary>
/// 获得方法
/// </summary>
/// <returns>返回方法</returns>
public Func<T, bool> GetFunc()
{
Func<T, bool> match = (Func<T, bool>)GetLambda().Compile(); return match;
} /// <summary>
/// 获得MemberExpression
/// </summary>
/// <param name="exp">表达式属性</param>
/// <returns>返回MemberExpression</returns>
private MemberExpression GetMemberExpression(Expression<Func<T, object>> exp)
{
var arrSplit = exp.Body.ToString().Split("(.)".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); var strProperty = string.Join(".", arrSplit, , arrSplit.Length - );
MemberExpression member = GetMemberExpression(strProperty);
return member;
} /// <summary>
/// 获得MemberExpression
/// </summary>
/// <param name="strProperty">表达式属性</param>
/// <returns>返回MemberExpression</returns>
private MemberExpression GetMemberExpression(string strProperty)
{
MemberExpression member; if (strProperty.Contains('.'))
{
string[] aryProperty = strProperty.Split('.'); member = Expression.Property(m_Parameter, aryProperty[]); for (int i = ; i < aryProperty.Length; i++)
{
member = Expression.Property(member, member.Type, aryProperty[i]);
}
}
else
{
member = Expression.Property(m_Parameter, strProperty);
} return member;
}
}
}

调用示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
List<Student> lstStu = new List<Student>();
lstStu.Add(new Student() { No = "", Name = "zhangsan", Classes = new Classes() { ClassID = "" } });
lstStu.Add(new Student() { No = "", Name = "lisi", Classes = new Classes() { ClassID = "" } });
lstStu.Add(new Student() { No = "", Name = "wangwu", Classes = new Classes() { ClassID = "" } });
lstStu.Add(new Student() { No = "", Name = "maliu", Classes = new Classes() { ClassID = "" } }); var le = new LambdaExtention<Student>(); ////自定义方法
le.IsTureMethod(x => x.Classes.ClassID, "", "ConsoleApplication1.Test", "Show"); ////两种写法
le.Equal(x => x.Classes.ClassID, "");
le.Equal("Classes.ClassID", ""); List<Student> stu = lstStu.FindAll(le.GetPredicate()); foreach (var item in stu)
{
Console.WriteLine(item.No);
} Console.Read();
}
} static class Test
{
public static bool Show(string str)
{
return false;
}
}
}

文章引用自:http://blog.jobbole.com/99431/

动态Lambda进阶一的更多相关文章

  1. SqlDataReader生成动态Lambda表达式

    上一扁使用动态lambda表达式来将DataTable转换成实体,比直接用反射快了不少.主要是首行转换的时候动态生成了委托. 后面的转换都是直接调用委托,省去了多次用反射带来的性能损失. 今天在对Sq ...

  2. 动态Lambda表达式打印HelloWorld

    最近在用C#与数据库打交道.开发过程中采用了ORM模型(以前是纯sql玩法,复杂的逻辑用存储过程做). 为了能通过配置文件动态地查询字段,也就是说需要能这样写: db.AsQuery<T> ...

  3. Entity Framework 高性能 泛型缓存+动态Lambda

    前言:自学CSharp挺长时间的了,这是我第一编博客,跟大家分享一下.如有不足地方请多多包涵,也欢迎大家提出更好的意见,下面开始进入正题. 一.泛型缓存 1.概念:1.泛型(泛型也是一种推断类型,从而 ...

  4. 生成动态Lambda表达式1

    SqlDataReader生成动态Lambda表达式 上一扁使用动态lambda表达式来将DataTable转换成实体,比直接用反射快了不少.主要是首行转换的时候动态生成了委托. 后面的转换都是直接调 ...

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

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

  6. C# 构建动态Lambda表达式

    做CURD开发的过程中,通常都会需要GetList,然而查询条件是一个可能变化的需求,如何从容对应需求变化呢? 首先,我们来设计一个套路,尝试以最小的工作量完成一次查询条件的需求变更 1.UI收集查询 ...

  7. Linq之Lambda进阶

    目录 写在前面 系列文章 带有标准查询运算符的Lambda Lambda中类型推断 Lambda表达式中变量作用域 异步Lambda 总结 写在前面 上篇文章介绍了Lambda的基本概念以及匿名方法, ...

  8. EntityFramework使用动态Lambda表达式筛选数据

    public static class PredicateBuilder { public static Expression<Func<T, bool>> True<T ...

  9. 动态lambda 构建

    var param = Expression.Parameter(typeof(T)); var datetime1 = Expression.Constant(dt1); var datetime2 ...

随机推荐

  1. UNIX下改动时间简单一例

    UNIX下改动时间简单一例 仅仅输入date就显示当前的工作站时间,假设有root超级用户权限,加上參数能够改动 工作站的时间. 格式:date mmddHHMM[cc]yy mm--月份,dd--日 ...

  2. Hbase集群环境搭建

    Hbase数据库依赖 Hadoop和zookeeper,所以,安装Hbase之前,需要先把zookeeper集群搭建好.(当然,Hbase有内建的zookeeper,不过不建议使用).Hbase配置上 ...

  3. 《转》python 网络编程

    原地址:http://blog.163.com/benben_long/blog/static/19945824320121225918434/ 网络客户端: 1. 理解socket: socket是 ...

  4. How to convert `ctime` to `datetime` in Python? - Stack Overflow

    How to convert `ctime` to `datetime` in Python? - Stack Overflow How to convert `ctime` to `datetime ...

  5. 解决NGINX的WORDPRESS伪静态规则失效的问题

    解决NGINX的WORDPRESS伪静态规则失效的问题 前两天搬到了EMSVPS的PR线路上,用上了最新的WDCP2.0管理面板,支持多用户管理(我们几个合租的VPS,最需要这个功能了),感觉很不错, ...

  6. [poj 2991]Crane[线段树表示向量之和,而非数量]

    题意: 起重机的机械臂, 由n段组成, 对某一些连接点进行旋转, 询问每次操作后的末端坐标. 思路: 由于旋转会影响到该点之后所有线段的角度, 因此容易想到用线段树记录角度, 成段更新. (但是不是每 ...

  7. 使用CXF创建REST WEBSERVICE

    简单小结下CXF跟REST搭配webservice的做法,直接举代码为样例: 1 order.java   package com.example.rest; import javax.xml.bin ...

  8. 【C#遗补】获取应用程序路径之System.IO.Directory.GetCurrentDirectory和System.Windows.Forms.Application.StartupPath的区别

    原文:[C#遗补]获取应用程序路径之System.IO.Directory.GetCurrentDirectory和System.Windows.Forms.Application.StartupPa ...

  9. hdu2125(数学)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2125 题意:N×M的网格其中有一条边坏掉了,问从起点到终点的放法数. 分析:数学公式 如果没有坏边的话 ...

  10. hdu1540(线段树)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题意:是一条线上的点,D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢 ...