动态Lambda进阶一
直接上代码:
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进阶一的更多相关文章
- SqlDataReader生成动态Lambda表达式
上一扁使用动态lambda表达式来将DataTable转换成实体,比直接用反射快了不少.主要是首行转换的时候动态生成了委托. 后面的转换都是直接调用委托,省去了多次用反射带来的性能损失. 今天在对Sq ...
- 动态Lambda表达式打印HelloWorld
最近在用C#与数据库打交道.开发过程中采用了ORM模型(以前是纯sql玩法,复杂的逻辑用存储过程做). 为了能通过配置文件动态地查询字段,也就是说需要能这样写: db.AsQuery<T> ...
- Entity Framework 高性能 泛型缓存+动态Lambda
前言:自学CSharp挺长时间的了,这是我第一编博客,跟大家分享一下.如有不足地方请多多包涵,也欢迎大家提出更好的意见,下面开始进入正题. 一.泛型缓存 1.概念:1.泛型(泛型也是一种推断类型,从而 ...
- 生成动态Lambda表达式1
SqlDataReader生成动态Lambda表达式 上一扁使用动态lambda表达式来将DataTable转换成实体,比直接用反射快了不少.主要是首行转换的时候动态生成了委托. 后面的转换都是直接调 ...
- c# ef 排序字段动态,构建动态Lambda和扩展方法OrderBy
1.动态构建排序 Lambda /// <summary> /// 获取排序Lambda(如果动态排序,类型不同会导致转换失败) /// </summary> /// < ...
- C# 构建动态Lambda表达式
做CURD开发的过程中,通常都会需要GetList,然而查询条件是一个可能变化的需求,如何从容对应需求变化呢? 首先,我们来设计一个套路,尝试以最小的工作量完成一次查询条件的需求变更 1.UI收集查询 ...
- Linq之Lambda进阶
目录 写在前面 系列文章 带有标准查询运算符的Lambda Lambda中类型推断 Lambda表达式中变量作用域 异步Lambda 总结 写在前面 上篇文章介绍了Lambda的基本概念以及匿名方法, ...
- EntityFramework使用动态Lambda表达式筛选数据
public static class PredicateBuilder { public static Expression<Func<T, bool>> True<T ...
- 动态lambda 构建
var param = Expression.Parameter(typeof(T)); var datetime1 = Expression.Constant(dt1); var datetime2 ...
随机推荐
- hdu 2842 Chinese Rings
点击打开hdu2842 思路: 矩阵快速幂 分析: 1 题目的意思是给定n个环,和一些规则要把所有的环全部拆下最少需要的步数 2 题目规定如果要拆第n个环,那么第n-1个要挂着,n-2环要被拆下.那么 ...
- MySQL分区技术 (一)
4:MySQL 分区技术(是mysql 5.1以版本号后開始用->是甲骨文mysql技术团队维护人员以插件形式插入到mysql里面的技术) 眼下,针对海量数据的优化主要有2中方法: 1:大表拆成 ...
- [Network]Wireless and Mobile
Wireless 1 Introduction 1.1 Elements 1. Wireless Hosts Wireless does not mean mobility. 2. Base Stat ...
- sql连接错误(Microsoft SQL Server,错误:2)
昨天用SQL语句建表的时候写了一段代码,对于代码的逻辑和内容我不太肯定对不正确.反正是毫不犹豫的让它运行了,过程中出现好几个错误,当时没有太在意,想着大不了出错了再重写一个.结果--玩坏了,从昨天到如 ...
- Linux共享wifi给Android手机
亲測可行,測试系统:Deepin2014,Ubuntu也一样.步骤很easy. 1.卸载hostapd,sudo apt-get remove hostapd(假设原来装过的话卸载,由于某些版本号不支 ...
- Andriod中绘(画)图----Canvas的使用具体解释
转载请注明出处:http://blog.csdn.net/qinjuning 因为在网络上找到关于Canvas的使用都比較抽象,或许是我的逻辑思维不太好吧,总是感觉理解起来比較困难, 尤其是对 ...
- OC 获取城市首字母
解析依据文件中面的内容,读入一个城市,输出所在首字母 比方读入 长春 输出 c 读入 北京 输出 b 不知道文本中的字体是什么格式 读取文件时 程序不能正确执行 运用oc中的字典 initWithOb ...
- HDOJ 4964 Emmet
递归语法翻译... Emmet Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
- Spark技术内幕:Stage划分及提交源代码分析
当触发一个RDD的action后.以count为例,调用关系例如以下: org.apache.spark.rdd.RDD#count org.apache.spark.SparkContext#run ...
- IIS设置允许下载.exe文件解决方法
最近很多客户使用IIS服务器,然后提示返现宝下载无法找到等无法下载的问题. 返现宝是.exe安装文件,部分服务器或主机可能无法下载. 第一.如果是自己服务器或VPS请按如下设置: 1.设置MIME,让 ...