[总结]动态Lambda表达式构建

 

直接上代码:

var ints =
new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            //var r = ints.Where(i => i > 5);   
            // 要实现的表达式  

            // 创建参数 i  
            var parameter =
            Expression.Parameter(typeof(int), "i");

            // 创建常量5  
            var constant =
            Expression.Constant(5);

            // 创建比较表达式 i > 5  
            var bin =
            Expression.Equal(parameter, constant);

            bin = Expression.Or(bin, Expression.Equal(parameter, Expression.Constant(3)));


            // 获取Lambda表达式  
            var lambda =
            Expression.Lambda<Func<int, bool>>(bin, parameter);

            // 通过 Compile 方法获取 Delegate  
            var _r = ints.Where(lambda.Compile());

            foreach (var v in _r)
                Response.Write(v+"<br>");

 

 

自定义实体的动态Lambda表达式构建:

 

public class Student
        {
            public int ID { get; set; }
            public string Name { get; set; }
        }

//构建测试数据

  List<Student> students = new List<Student>();
   students.Add(new Student() {  ID=1, Name="张三"});
   students.Add(new Student() { ID = 2, Name = "李四" });
   students.Add(new Student() { ID = 3, Name = "王二" });
   students.Add(new Student() { ID = 4, Name = "李小兰" });
   students.Add(new Student() { ID = 5, Name = "黄五" });

 

//构建参数表达式

var parameter =Expression.Parameter(typeof(Student), "student");

//构建实体属性表达式

MemberExpression memberExpression = Expression.Property(parameter, "ID");

//构建常量表达式

var constant = Expression.Constant(1);

//表达式组合 效果等于 student=>student.ID==1

var bin = Expression.Equal(memberExpression, constant);

 

//表达式组合 效果等于 student=>student.ID==1&&student.ID==2

bin = Expression.Or(bin, Expression.Equal(memberExpression, Expression.Constant(2)));

 

 // 获取Lambda表达式  
            var lambda =
            Expression.Lambda<Func<Student, bool>>(bin, parameter);

 var _r = students.Where<Student>(lambda.Compile());
            foreach (Student s in _r)
            {
                Response.Write(s.Name + "<br>");
            }

 

显示结果:

张三
李四

posted @ 2012-06-01 17:54  寒风吹过  阅读(341)  评论(0编辑  收藏  举报