转 动态创建Lambda表达式实现高级查询
摘自:
http://blog.csdn.net/hao134838/article/details/51404151
摘部分:
具体实现—小Demo
首先需要引入命名空间
using System.Linq.Expressions.Expression;
- //创建一个数组用来当做例子
- var ints = new int []{ 1, 2 , 3 , 4 , 5 , 6 };
- // 要创建形如 i => i < 5
- //创建参数 i
- var parameter = Expression.Parameter(typeof(int),”i”);
- //创建常数 5
- var constant = Expression.Constant(5);
- //创建 i > 5
- var bin = Expression.GreaterThan(parameter,constant);
- //获取Lambda表达式
- var lambda=Expression.Lambda<Func<Int32,Boolean>>(bin,parameter);
- //取得查询结果
- var query = ints.Where(lambda.Compile());
通过上面一个小Demo我们可以简单的看到动态创建Lambda表达式的雏形,下面在介绍一个比较复杂的例子。
- BinaryExpression condition = null;
- //要构造的表达式i==1||i==2||i==3.....
- for (int i = 0; i < ints.Length; i++)
- {
- ConstantExpression ce = Expression.Constant(i);
- if (condition == null)
- {
- condition = Expression.Equal(parameter, ce);
- }
- else
- {
- var right = Expression.Equal(parameter, ce);
- condition = Expression.Or(condition, right);
- }
- }
- Expression<Func<Int32, Boolean>> lambda = Expression.Lambda<Func<Int32, Boolean>>(condition, parameter);
实体类的实现
上面都是比较简单的小例子,但是在我们项目中都是来对实体进行条件查询的,所以呢小编在下面会给大家介
绍一下如何对实体类进行构造。
- //p => p.Name == "1" && p.Address == "2"
- ParameterExpression parameter1 = Expression.Parameter(typeof(Person), "p");
- MemberExpression member1 = Expression.PropertyOrField(parameter1, "Name");
- MemberExpression member2 = Expression.PropertyOrField(parameter1, "Address"),
- ConstantExpression constant1 = Expression.Constant("郑浩");
- ConstantExpression constant2 = Expression.Constant("河北");
- var query1 = Expression.Equal(member1, constant1);//Equal等于;GreaterThanOrEqual大于;LessThanOrEqual小于
- var query2 = Expression.Equal(member2, constant2);
- var query = Expression.And(query1, query2);//and 与;or或
- var lambda1 = Expression.Lambda<Func<Person, Boolean>>(query, parameter1);
- var list = MethodExtend.GetUser(lambda1.Compile());
代码介绍:
1)创建表达式的开始部分:p=>
2、3)创建我们要查询的字段:p.Name和p.Address
4、5)给给变量赋值,这些值和变量可以任意匹配
6、7)匹配查询条件和对应的值:p.Name=="郑浩";p.Address=="河北"
8、9)连接查询条件;p.Name=="郑浩"&&p.Address=="河北"
10)创建最后的查询条件:p=>p.Name=="郑浩"&&p.Address=="河北"
11)最后执行查询条件
dfdf dfd